2

我必须制作一个程序,我必须将十进制系统中的数字转换为另一个数字(以 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 个整数变量,“n”是十进制数,“b”是基数,并返回一个带有转换后数字的字符串。在按钮过程中,我在 TMemo 中显示数字

memo1.Lines.Add(cambiarBase(n,b)); 

我遇到的问题是:使用函数的方式以相反的顺序给出数字(例如,基数 9 中的 301 是 364,但它显示为 463)。但是,如果我在 if 语句之后使用 ReverseString 函数,那么它会以不同的顺序显示数字(在示例中,数字现在是 634)。

但是,如果我在 memo1.Lines.Add (函数外部)应用 ReverseString 函数,那么它会显示正确的转换。

我想知道如何让它通过函数本身返回正确的数字顺序。

该程序编译它没有任何错误。

再次感谢您的阅读。

利奥AM

4

1 回答 1

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)
于 2014-03-24T21:01:24.777 回答