【问题标题】:Number system convertion with Recursive function - Error in return value使用递归函数进行数字系统转换 - 返回值错误
【发布时间】:2014-03-24 21:00:18
【问题描述】:

我必须编写一个程序,我必须将十进制系统中的数字转换为另一个数字(以 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 函数,那么它会显示正确的转换。

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

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

再次感谢您的阅读。

LeoAM

【问题讨论】:

    标签: delphi recursion number-systems


    【解决方案1】:

    你只需要颠倒串联的顺序。而不是:

    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)
    

    【讨论】:

    • 谢谢你,我的错我没有想到颠倒串联的顺序。当我以相反的顺序得到结果时,我想我可以使用 ReverseString 函数。另外,在课堂上,我们使用函数名而不是“结果”,但我会在此处提问时记下使用它。
    • 如果他们在课堂上教你函数名,那很好。这就是经典 Pascal 中的做法。特殊的 Result 变量是 Delphi 扩展。
    猜你喜欢
    • 1970-01-01
    • 2018-01-04
    • 2015-02-08
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2014-10-25
    • 2020-10-10
    • 2021-06-11
    相关资源
    最近更新 更多