【发布时间】:2016-08-20 18:21:03
【问题描述】:
这是一个用于递归计算 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。程序按预期运行:使用 even_collatz 和数字 10 调用 collatz_counter。
下一步的预期操作是运行collatz_counter,initialNumber 为 1,initialLength 为 10。我期望会发生的是第一个 if 语句将评估为 true,@ 987654328@ 应该返回length 然后退出。然而,情况并非如此:
实际发生的情况是,该函数评估第一个 if 语句,运行 return length 行,然后跳转到 if initialNumber % 2... 下的代码行,整个过程在无限循环中一遍又一遍地重复自己.
关于为什么会发生这种情况的任何想法?
【问题讨论】:
-
如果初始数字不是 1,则 elif 和 else 子句不会返回任何内容。你也在内部调用一个函数:
collatz_counter -
请修正代码。看起来您在
collatz_counter()的最后几行中缺少一些右括号。此外,正如@Andrew 暗示的那样,这些行应该是returncollatz_counter(...) -
我已经编辑过了。它们只是 SE 中的拼写错误,在实际代码中它们是正确的。 linusG 给了我一个提示,我修复了它们。安德鲁,这就是为什么我无法弄清楚问题所在,它正在评估不应该评估的东西。
-
现在是另一个错字:应该是
print(collatz_counter(13, 1)),你漏掉了一个右括号。
标签: python function recursion collatz