小写递归算法
To lower case recursive algorithm
我有这段代码使用递归返回一个全小写的字符串:
function min(ch:string):string;
begin
if ( ch = '' ) then
min:= ''
else
if (ch[1] in ['A'..'Z']) then
begin
ch[1]:=chr(ord(ch[1])+32);
min:= ch[1] + min(copy(ch,2,length(ch)-1));
end;
end;
但是不行:
当我用 运行 示例 min('AbC')
时,输出是 a
而不是 abc
。
这里的问题在哪里?
问题是你并不总是调用递归函数。一旦你发现一个已经是小写的字母,你就不会再看它后面的字符了。因此 return 值是 t运行 取决于该字符。
当被查看的字符不是大写字母时,您也应该调用它。因此,将递归调用移出 if
,它将起作用:
function min(ch:string):string;
begin
if ( ch = '' ) then
min:= ''
else
begin
if (ch[1] in ['A'..'Z']) then
ch[1]:=chr(ord(ch[1])+32);
min:= ch[1] + min(copy(ch,2,length(ch)-1));
end;
end;
在 ideone.com 上查看 运行。
我有这段代码使用递归返回一个全小写的字符串:
function min(ch:string):string;
begin
if ( ch = '' ) then
min:= ''
else
if (ch[1] in ['A'..'Z']) then
begin
ch[1]:=chr(ord(ch[1])+32);
min:= ch[1] + min(copy(ch,2,length(ch)-1));
end;
end;
但是不行:
当我用 运行 示例 min('AbC')
时,输出是 a
而不是 abc
。
这里的问题在哪里?
问题是你并不总是调用递归函数。一旦你发现一个已经是小写的字母,你就不会再看它后面的字符了。因此 return 值是 t运行 取决于该字符。
当被查看的字符不是大写字母时,您也应该调用它。因此,将递归调用移出 if
,它将起作用:
function min(ch:string):string;
begin
if ( ch = '' ) then
min:= ''
else
begin
if (ch[1] in ['A'..'Z']) then
ch[1]:=chr(ord(ch[1])+32);
min:= ch[1] + min(copy(ch,2,length(ch)-1));
end;
end;
在 ideone.com 上查看 运行。