我需要编写一个递归函数dec2base(n, b)
,它返回正整数b
中的基数n
数字列表。例如。
dec2base(120, 10) => [1,2,0] (1 * 10**2 + 2 * 10**1 + 0 * 10**0)
目前我有。
def dec2base(n, b):
if n < 10:
return [n]
else:
return dec2base(n, b) + [n%b]
但是当我运行程序时,它会返回一个无限循环错误。有什么想法吗?
答案 0 :(得分:3)
您不会在方法中的任何位置递减n的值,因此如果您从任何n> = 10的值开始,则循环永远不会结束。
另一个观察 - 如果b不等于10,则“if n&lt; 10 return [n]”的逻辑似乎没有意义。例如,9&lt; 10,但我假设dec2base(9,2)的值不会是[9]。它将是[1,0,0,1]。
答案 1 :(得分:2)
好的,在任何递归函数中,必须有一些函数变为零才能停止。在这种情况下,你想要的是真正模仿你手工操作的方式:
也就是说,如果您发现十六进制值为1000,则执行
dec2base(1000,16):
现在,显然每次进行重写步骤时,第一个参数都会变小,如果你想一想,最终必须变为0.所以最终它会终止。
这是Python中一个真正的简单版本:
result = ""
def dec2base(n,b):
global result
if n <= 0: return
result = str(n % b) + result # why am I prepending it?
dec2base( n // b, b)
if __name__ == '__main__':
dec2base(1000,8)
print result
现在,如果基数是任何&gt; 9(比如说16)你需要注意将10到15之间的值转换成alpha a-f,这有点不太优雅,因为我希望它像示例一样布局。
答案 2 :(得分:1)
您的解决方案中只有一些小错误。
def dec2base(n, b):
if n < b: # so it will work for bases other than 10
return [n]
else:
return dec2base(n//b, b) + [n%b] # you're just missing "//b" here
你可以像这样稍微简化一下
def dec2base(n, b):
if not n:
return []
return dec2base(n//b, b) + [n%b]
答案 3 :(得分:0)
您致电dec2base(n, b)
无限。如果你打电话
dec2base(20, b)
您的函数将继续执行if / else语句的第二个分支。您需要将减少的值传递给递归函数调用,以便最终n < 10
计算为True。