Python Collatz功能未正确退出
下面是一个用于递归计算Collatz序列长度的程序:Python Collatz功能未正确退出,python,function,recursion,collatz,Python,Function,Recursion,Collatz,下面是一个用于递归计算Collatz序列长度的程序: def odd_collatz ( n ): return (3 * n) + 1 def even_collatz ( n ): return int(n / 2) def collatz_counter ( initialNumber, initialLength ): length = initialLength while True: if initialNumber == 1:
def odd_collatz ( n ):
return (3 * n) + 1
def even_collatz ( n ):
return int(n / 2)
def collatz_counter ( initialNumber, initialLength ):
length = initialLength
while True:
if initialNumber == 1:
return length
elif initialNumber != 1:
length += 1
if initialNumber % 2 == 0:
collatz_counter(even_collatz(initialNumber), length)
else:
collatz_counter(odd_collatz(initialNumber), length)
print(collatz_counter(13, 1)
预期答案应该是10。然而,程序陷入了无限循环。在序列的倒数第二步initalNumber
等于2。程序按预期运行:collatz\u计数器
使用偶数collatz
和数字10调用
下一步的预期操作是运行collatz_计数器
,initialNumber
为1,initialLength
为10。我希望第一个if语句的计算结果为true,collatz_计数器
应该返回length
,然后退出。然而,情况并非如此:
实际情况是,函数计算第一条if语句,运行返回长度
行,然后跳转到if initialNumber%2…
下的代码行,整个过程在无限循环中一次又一次地重复
关于为什么会发生这种情况有什么想法吗?在我看来像是打字错误。定义一个函数
collatz\u counter
需要两个数字
但你这样称呼它:
...
print(collatz_counter(13), 1)
只需尝试将最后一行更改为:
print(collatz_counter(13, 1))
应该没问题
希望这有帮助 您以一种有点奇怪的方式混合了递归和循环。问题是
,而True:
。因为你永远不会从循环中返回任何东西,所以没有什么可以阻止它永远继续下去。您的代码达到1,然后继续增加长度。这是一个固定版本
def odd_collatz ( n ):
return (3 * n) + 1
def even_collatz ( n ):
return int(n / 2)
def collatz_counter ( initialNumber, initialLength ):
length = initialLength
if initialNumber == 1:
return length
elif initialNumber != 1:
length += 1
if initialNumber % 2 == 0:
return collatz_counter(even_collatz(initialNumber), length)
else:
return collatz_counter(odd_collatz(initialNumber), length)
print(collatz_counter(13, 1))
主要错误是
while True:
循环,以及缺少的返回
def odd_collatz ( n ):
return (3 * n) + 1
def even_collatz ( n ):
return int(n / 2)
def collatz_counter(initialNumber, length):
if initialNumber == 1:
return length
elif initialNumber != 1:
length += 1
if initialNumber % 2 == 0:
return collatz_counter(even_collatz(initialNumber), length)
else:
return collatz_counter(odd_collatz(initialNumber), length)
print(collatz_counter(13, 1))
打印10。如果初始数字不是1,则elif和else子句不会返回任何内容。您还调用了自身内部的函数:
collatz\u counter
请修复代码。在collatz\u counter()
的最后几行中,似乎缺少一些右括号。另外,正如@Andrew所暗示的,这些行应该是return
collatz\u counter(…)
我已经编辑过了。它们只是SE中的拼写错误,在实际代码中它们是正确的。linusG给了我一个提示,我把它们修好了。Andrew,这就是为什么我不能找出问题所在,它在评估不应该评估的东西。现在它的另一个打字错误是:应该是print(collatz_counter(13,1))
,你错过了一个右括号。为了弥补这个问题,如果length
默认为0,它会在函数自身扫描之前增加到1,函数将返回,因为长度现在是1。当我在这里输入它时,这是一个输入错误。在程序中,它是正确编写的。谢谢你提醒我!我在解决它的手术室里改变了它!我学到了一些关于如何正确执行递归的知识。谢谢