Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 带递归函数的数字系统转换-返回值错误_Delphi_Recursion_Number Systems - Fatal编程技术网

Delphi 带递归函数的数字系统转换-返回值错误

Delphi 带递归函数的数字系统转换-返回值错误,delphi,recursion,number-systems,Delphi,Recursion,Number Systems,我必须做一个程序,把十进制的数字转换成另一个以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到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;
我遇到的问题是:用函数的方式,它以相反的顺序给出数字 e、 基9中的g.301是364,但其显示为463。但是如果我在if语句之后使用ReverseString函数,那么这个数字在示例中以不同的顺序显示,现在是634

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

我想知道的是如何让函数本身返回正确的数字顺序

程序编译时没有任何错误

再次感谢您的阅读


LeoAM

您只需颠倒连接顺序即可。而不是:

cambiarBase := inttostr(n mod b) + cambiarBase(n div b, b);
你写

cambiarBase := cambiarBase(n div b, b) + inttostr(n mod b);
如果您考虑一下这一点,很明显,连接应该是这样的。在该表达式中,inttostrn 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;
接下来我们需要评估

cambiarBase(6, 4) = cambiarBase(1, 4) + inttostr(2)
最后是终止

cambiarBase(1, 4) = inttostr(1)
把所有的插头插在一起,你就有了

cambiarBase(27, 4) = inttostr(1) + inttostr(2) + inttostr(3)

您只需要颠倒连接的顺序。而不是:

cambiarBase := inttostr(n mod b) + cambiarBase(n div b, b);
你写

cambiarBase := cambiarBase(n div b, b) + inttostr(n mod b);
如果您考虑一下这一点,很明显,连接应该是这样的。在该表达式中,inttostrn 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;
接下来我们需要评估

cambiarBase(6, 4) = cambiarBase(1, 4) + inttostr(2)
最后是终止

cambiarBase(1, 4) = inttostr(1)
把所有的插头插在一起,你就有了

cambiarBase(27, 4) = inttostr(1) + inttostr(2) + inttostr(3)

谢谢你,是我的错,我没想到要颠倒连接顺序。当我以相反的顺序得到结果时,我想我可以使用ReverseString函数。另外,在课堂上我们使用函数名而不是“result”,但我在这里提问时会注意使用它。如果他们在课堂上教你函数名,那就好了。经典的帕斯卡就是这样做的。特殊的结果变量是一个Delphi扩展。谢谢你,我的错,我没有想到反转串联的顺序。当我以相反的顺序得到结果时,我想我可以使用ReverseString函数。另外,在课堂上我们使用函数名而不是“result”,但我在这里提问时会注意使用它。如果他们在课堂上教你函数名,那就好了。经典的帕斯卡就是这样做的。特殊的结果变量是Delphi扩展。