繁体   English   中英

这个递归函数如何跟踪它已经执行了多少次?

[英]How does this recursive function keep track of how many times it has been executed?

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 项。 虽然还没有被证明(Collat​​z 问题),但认为所有的起始数字都以 1 结束。

100 万以下的哪个起始数字产生最长的链?

我找到了这个递归函数,它计算给定数字的 Collat​​z 链的长度。 数学逻辑非常简单,易于理解。 但是,我不明白该函数如何跟踪链的长度。

代码如下:

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 ,因为改变它会导致错误的长度。 如果有人可以向我解释该函数如何在没有列表或计数器的情况下跟踪长度,那就太好了。

让我们用它的返回值替换函数调用。 我们从

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每次调用函数。 把它们加起来,你就得到了你的链长。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM