【发布时间】:2019-12-08 17:28:07
【问题描述】:
Project Euler 问题 14 给出以下问题:
为正整数集合定义以下迭代序列:
n → n/2(n 是偶数)
n → 3n + 1(n 为奇数)使用上面的规则并从 13 开始,我们生成以下序列:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
可以看出,这个序列(从 13 开始,到 1 结束)包含 10 个术语。虽然还没有被证明(Collatz Problem),但人们认为所有的起始数字都以 1 结束。
100 万以下的哪个起始数字产生最长的链?
我发现了这个递归函数,它计算给定数字的 Collatz 链的长度。数学逻辑非常简单易懂。但是,我不明白该函数如何跟踪链的长度。
代码如下:
def find_collatz_chain_length(x):
if x == 1:
print('here')
return 1
if x % 2 == 0:
y = x // 2
print(y)
else:
y = x * 3 + 1
print(y)
return find_collatz_chain_length(y) + 1
我添加了打印语句以在执行时遵循逻辑。例如:
print(find_collatz_chain_length(13))
然后我得到以下输出:
40
20
10
5
16
8
4
2
1
here
10
这对我来说是有意义的,直到它返回链的长度 (10)。我知道这与最终 return 语句中的 +1 有关,因为更改它会导致错误的长度。如果有人可以向我解释该函数如何在没有列表或计数器的情况下跟踪长度,那就太好了。
【问题讨论】:
-
想想
return声明。你要添加什么1到? -
它要求函数返回 collatz 链的下一个值。我觉得答案正盯着我看,但我的大脑正在冻结。
-
that 函数调用会返回什么?