这是一个旨在递归计算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:
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_counter
和数字10调用even_collatz
。
下一步的预期操作是运行collatz_counter
,initialNumber
为1,initialLength
为10.我期望会发生的是第一个if语句将评估为true,collatz_counter
应返回length
,然后退出。但是,这不会发生什么:
实际发生的是函数计算第一个if语句,运行return length
行,然后跳转到if initialNumber % 2...
下的代码行,整个过程一遍又一遍地重复在无限循环中。
关于为什么会发生这种情况的任何想法?
答案 0 :(得分:3)
你正在以一种奇怪的方式混合递归和循环。问题是while 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))
答案 1 :(得分:2)
看起来像是一个错字。您定义了一个期望两个数字的函数collatz_counter
。
但你这样称呼它:
...
print(collatz_counter(13), 1)
尝试将最后一行更改为:
print(collatz_counter(13, 1))
应该没事。
希望这有帮助!
答案 2 :(得分:0)
主要错误是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。