当前位置: 首页 > 知识库问答 >
问题:

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

姬安志
2023-03-14

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个术语。虽然这还没有被证明(科拉兹问题),但人们认为所有的起始数字都以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语句以在执行时遵循逻辑。例如:

print(find_collatz_chain_length(13))

然后我得到以下输出:

40 
20
10
5
16
8
4
2
1
here
10

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

共有1个答案

杜阳泽
2023-03-14

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

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\u collatz\u chain\u length(10)1:

(((find_collatz_chain_length(10) + 1) + 1) + 1)

每次调用函数时,它都会添加一个1,直到函数的输入为1,此时它停止调用自己,只返回1。您最终会得到类似的东西

(((((1) + 1) + 1) + 1) ... + 1)

每次调用函数时,都有一个1。把它们加起来,你就得到了你的链条长度。

 类似资料:
  • 我一直在网上看递归(C语言)的例子,试图更好地理解它和它是如何工作的。一般来说,我可以毫无问题地跟踪一些基本的递归问题(比如阶乘问题),但是我发现了这个问题,并且完全不知道如何跟踪它。 这个想法是让用户输入一个变化量,通过使用递归,您打印出可以进行变化量的方式数量。代码如下: 显然,这是递归的常见应用。不过,我无法理解这种递归是如何工作的。对我来说最突出的是,同一条线路上有2个递归调用。我从未见过

  • 上面的代码接受一个整数,并通过将其乘以自己的数字将其减少为一个数字。 例如39。 控制台将记录: 如何跟踪递归函数被调用了3次? 我尝试添加计数器,但无法更新。非常感谢您的帮助

  • Leetcode问题https://leetcode.com/problems/count-binary-substrings/ 该解决方案有效,但我很难提出递归解决方案的时间复杂度。 每当循环遇到s.charAt(i)!=s.charAt(i 1)时,它都会进行递归调用以展开,直到达到基本大小写或其他部分。 因为我遍历整个字符串,所以for循环是O(n)。但是如何确定将进行的递归调用的数量,因为

  • 我仍在尝试实现2-3个手指树,并取得了良好的进展(存储库)。在做一些基准测试时,我发现当树非常大时,我非常基本的toList会导致堆栈溢出异常。起初,我看到了一个简单的修复方法,并将其设置为尾部递归。 不幸的是,事实证明,toList不是罪魁祸首,但viewr是: 寻找唯一的递归调用很明显,这不是尾部递归。不知何故,我希望这个问题不会存在,因为这个调用被包装在一个类似于连续的延迟中。 我听说并读过

  • 让我们举这个例子 js编译器知道所有的函数声明,所以我可以在< code > main < code > main(second())内部调用< code>second。我不明白递归函数是如何在函数声明内部调用同一个函数的 我的思考过程是:好吧,这是函数声明,这是函数所做的,但是如何 即使声明没有完成,我也可以调用相同的函数

  • 1. 单步执行和跟踪函数调用 看下面的程序: 例 10.1. 函数调试实例 #include <stdio.h> int add_range(int low, int high) { int i, sum; for (i = low; i <= high; i++) sum = sum + i; return sum; } int main(void) { int result[1