递归函数无法正常工作

1 投票
4 回答
6957 浏览
提问于 2025-04-15 23:23

我在弄清楚这里出了什么问题时遇到了很大的困难:

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 个回答

2

你现在只是在最深的递归层级返回一个值,然后在第二深的层级把这个值给忽略掉了。

所有的 self.iterated(...) 这一行都应该改成 return self.iterated(...)

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)
5

在这两个 elif 块里,你在进行递归调用后没有返回任何值。你需要在递归调用 iterated 之前加上一个 return(比如 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))

这个代码不需要放在一个类里,因为没有必要使用任何成员。

撰写回答