项目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问题),它被认为所有的起始数结束在1。
哪个起始数,在一百万以下,产生最长的链?
我找到了这个递归函数,它计算给定数字的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语句,以便在执行时遵循逻辑。例如:
print(find_collatz_chain_length(13))
然后得到以下输出:
40
20
10
5
16
8
4
2
1
here
10
这对我来说很有意义,直到它返回链(10)的长度为止。我知道这与最终返回语句中的+1
有关,因为修改它会导致错误的长度。如果有人能向我解释这个函数是如何在没有列表或计数器的情况下跟踪长度的话,那就太好了。
发布于 2019-12-08 19:19:49
让我们用函数的返回值替换函数调用。我们一开始
find_collatz_chain_length(13)
会回来的
find_collatz_chain_length(40) + 1
查看函数调用,它将返回find_collatz_chain_length(20) + 1
,但在第一次调用函数时,我们已经有了一个+ 1
:
(find_collatz_chain_length(20) + 1) + 1
该函数调用返回find_collatz_chain_length(10) + 1
(((find_collatz_chain_length(10) + 1) + 1) + 1)
每次函数被调用时,它都会添加一个+ 1
,直到函数的输入是1
,此时它停止调用自己,只返回1。
(((((1) + 1) + 1) + 1) ... + 1)
每次调用该函数时都使用一个1
。把它们加起来,你就可以得到你的链子长度。
https://stackoverflow.com/questions/59237980
复制相似问题