我必须制作一个程序,我必须将十进制系统中的数字转换为另一个(基数2到9),就像我的第一个问题一样。
但是这次我必须使用递归函数。所以我来了:
function cambiarBase(n,b: integer): string;
Begin
if n < b then
cambiarBase := inttostr(n)
else
cambiarBase := inttostr(n mod b) + cambiarBase(n div b, b);
End;
需要2个整数变量,&#39; n&#39;是十进制数字&#39; b&#39;作为基础,并返回一个转换后的数字的字符串。在按钮程序中,我在TMemo中显示数字
memo1.Lines.Add(cambiarBase(n,b));
我遇到的问题是:使用函数的方式以相反的顺序给出数字 (例如,基数9中的301是364,但其显示为463)。但是如果我在if语句之后使用ReverseString函数,那么它以不同的顺序显示它的数字(在这个例子中,数字现在是634)。
但是如果我在memo1.Lines.Add(函数外部)中应用ReverseString函数,那么它会显示正确的转换。
我想要的是知道如何让它通过函数本身返回正确的数字顺序。
程序编译它没有任何错误。
再次感谢阅读。
LeoAM
答案 0 :(得分:4)
您只需要颠倒连接的顺序。而不是:
cambiarBase := inttostr(n mod b) + cambiarBase(n div b, b);
你写了
cambiarBase := cambiarBase(n div b, b) + inttostr(n mod b);
如果你想到这一点,那么连字应该是这样的。在该表达式中,inttostr(n mod b)
术语是不太重要的术语,因此出现在右侧。
对于它的价值,我认为如果使用Result
而不是函数名称,这段代码会更好。特别是对于递归函数,在视觉上难以区分结果变量和递归调用。我会这样写:
function cambiarBase(n, b: Integer): string;
begin
if n < b then
// termination
Result := IntToStr(n)
else
// recursive step
Result := cambiarBase(n div b, b) + IntToStr(n mod b);
end;
为了说明,让我们通过一个简单的例子来解决。假设我们知道27 base 4等于123(16 + 2 * 4 + 3)。
cambiarBase(27, 4) = cambiarBase(6, 4) + inttostr(3)
接下来我们需要评估
cambiarBase(6, 4) = cambiarBase(1, 4) + inttostr(2)
最后终止
cambiarBase(1, 4) = inttostr(1)
将它们全部插在一起
cambiarBase(27, 4) = inttostr(1) + inttostr(2) + inttostr(3)