首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这个递归函数如何跟踪它被执行了多少次?

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

Stack Overflow用户
提问于 2019-12-08 17:28:07
回答 1查看 156关注 0票数 0

项目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链的长度。数学逻辑非常简单,易于理解。但是,我不明白函数如何跟踪链的长度。

守则如下:

代码语言:javascript
运行
复制
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语句,以便在执行时遵循逻辑。例如:

代码语言:javascript
运行
复制
print(find_collatz_chain_length(13))

然后得到以下输出:

代码语言:javascript
运行
复制
40 
20
10
5
16
8
4
2
1
here
10

这对我来说很有意义,直到它返回链(10)的长度为止。我知道这与最终返回语句中的+1有关,因为修改它会导致错误的长度。如果有人能向我解释这个函数是如何在没有列表或计数器的情况下跟踪长度的话,那就太好了。

EN

回答 1

Stack Overflow用户

发布于 2019-12-08 19:19:49

让我们用函数的返回值替换函数调用。我们一开始

代码语言:javascript
运行
复制
find_collatz_chain_length(13)

会回来的

代码语言:javascript
运行
复制
find_collatz_chain_length(40) + 1

查看函数调用,它将返回find_collatz_chain_length(20) + 1,但在第一次调用函数时,我们已经有了一个+ 1

代码语言:javascript
运行
复制
(find_collatz_chain_length(20) + 1) + 1

该函数调用返回find_collatz_chain_length(10) + 1

代码语言:javascript
运行
复制
(((find_collatz_chain_length(10) + 1) + 1) + 1)

每次函数被调用时,它都会添加一个+ 1,直到函数的输入是1,此时它停止调用自己,只返回1。

代码语言:javascript
运行
复制
(((((1) + 1) + 1) + 1) ... + 1)

每次调用该函数时都使用一个1。把它们加起来,你就可以得到你的链子长度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59237980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档