2012-05-10 27 views
0

我需要编写一个递归函数dec2base(n, b),它返回正整数n中的基数为b的数字列表。例如。为什么我的递归函数错误?

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

添加一些打印语句,看它运行。它会帮助你看到你错在哪里。 – sdolan

回答

0

您致电dec2base(n, b)无穷大。如果你打电话

dec2base(20, b) 

你的功能将继续执行你的if/else语句的第二个分支。您需要将递减的值传递给递归函数调用,以便最终n < 10将评估为True。

+0

我试过n-1但是给出了错误的答案。我应该在n上做一个数学风格的东西吗? – Hoops

+0

做'n // b'。另外,你的if语句没有任何意义。 'dec2base(10,2)'会产生[5,0],这是不正确的。你想要的是'如果n

+0

非常感谢你! – Hoops

3

你不会在你的方法中的任何点递减n的值,所以如果你以n> = 10的任何值开始,循环永远不会结束。

另一种观察 - 如果b不等于10,则“if n < 10 return [n]”的逻辑似乎没有意义。例如,9 < 10,但我假设dec2base 9,2)不会[9]。这将是[1,0,0,1]。

2

好的,在任何递归函数中,必须有一些函数变为零才能停下来。在这种情况下,你想要的是you7手工方式做到这一点真的型号:​​

  • 除以基数(基)
  • 把剩余部分作为digite
  • 重现使用相同的基地,但该部门的其他部分。 (商。)

也就是说,如果你正在寻找的1000的十六进制值,则采取

dec2base(1000,16):

  • 如果第一参数== 0,返回时,你就大功告成了
  • 1000 MOD 16(= 8) - >保存8
  • dec2base(62,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 

现在,如果基础是什么> 9(比方说16),你需要从10取转换值的注意15到的αAF,这是有目的的不是很优雅,因为我希望它就像例子一样布置。

+2

通过修改全局变量传递其结果的递归函数? *认真*? – Ben

+1

我不确定你如何认为这是像例子一样布置的?对全球变量弹簧的需求从哪里来? –

+0

是的,因为它让我有机会提出关于预先考虑的问题。你不喜欢它,写你自己的答案。 –

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] 
相关问题