为什么我的递归函数错误?

时间:2012-05-10 01:12:57

标签: python recursion

我需要编写一个递归函数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]

但是当我运行程序时,它会返回一个无限循环错误。有什么想法吗?

4 个答案:

答案 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,则返回,您已完成
  • 1000 mod 16(= 8) - &gt;保存8
  • dec2base(62,16) - &gt;递归步骤

现在,显然每次进行重写步骤时,第一个参数都会变小,如果你想一想,最终必须变为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。