我很难弄清楚这里出了什么问题:
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
被正确返回但递归出错了。我不太确定。谢谢你的帮助。
答案 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(...)