递归函数无法正常工作

时间:2010-06-01 00:24:48

标签: python recursion

我很难弄清楚这里出了什么问题:

class iterate():
    def __init__(self):
        self.length=1
    def iterated(self, n):
        if n==1:
            return self.length
        elif n%2==0:
            self.length+=1
            self.iterated(n/2)
        elif n!=1:
            self.length+=1
            self.iterated(3*n+1)

例如,

x=iterate()
x.iterated(5)

输出None。它应该输出6,因为长度看起来像这样: 5 - > 16 - > 8 - > 4 - > 2 - > 1

在做了一些调试之后,我看到self.length被正确返回但递归出错了。我不太确定。谢谢你的帮助。

4 个答案:

答案 0 :(得分:4)

在两个elif块中,您在进行递归调用后不返回值。在递归调用return之前,您需要iterated(例如return self.iterated(n/2))。如果您没有明确return,该函数将返回None

这将解决此问题,但有一种方法可以使您的代码更简单:您实际上并不需要成员length。相反,您可以在递归调用的结果中添加1:

def iterated(n):
    if n==1:
        return 1
    elif n%2==0:
        return 1 + iterated(n/2)
    else:
        return 1 + iterated(3*n+1)

print(iterated(5))

这不需要在课堂上,因为不需要任何成员。

答案 1 :(得分:3)

你错过了回复陈述:

class iterate():
    def init(self):
        self.length=1
    def iterated(self, n):
        if n==1:
            return self.length
        elif n%2==0:
            self.length+=1
            **return** self.iterated(n/2)
        elif n!=1:
            self.length+=1
            **return** self.iterated(3*n+1)

答案 2 :(得分:2)

您只返回最深层递归的值,然后在第二深层忽略它。

所有self.iterated(...)行都应为return self.iterated(...)

答案 3 :(得分:2)

您应该使用return self.iterated(...)完成每个elif分支,而不仅仅是self.iterated(...)