这是一个旨在递归计算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
使用even_collatz
和数字10进行调用。
下一步的行动预计将运行collatz_counter
与initialNumber
1和initialLength
10.我期望会发生的是,第一个if语句将评估为真,collatz_counter
应该返回length
,然后退出。但是,这不会发生什么:
实际发生的情况是该函数计算第一个if语句,运行该return length
行,然后跳转到下面的代码行,if initialNumber % 2...
并且整个过程在无限循环中一遍又一遍地重复。
关于为什么会发生这种情况的任何想法?
您正在以某种奇怪的方式混合递归和循环。问题是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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句