c++ - 当同一语句中有两个递归调用时,递归如何工作?

标签 c++ recursion fibonacci

我最近开始研究算法和数据结构。我遇到了斐波那契问题及其使用递归的解决方案。但就是这样。我理解当只有一个时递归调用是如何工作的(比如数字的阶乘)。函数调用不断堆积,直到它们达到基本情况,然后它们开始解开一个所需的答案。

但我不明白的是,当像 f(n)+f(n/2) 这样的表达式中有两个递归调用时,递归是如何工作的。我的意思是先解决哪个调用,何时解决第二个调用。如果将此表达式分配给语句,又如何计算总和? 我自己写了一个小代码来破译这个。

#include <iostream>
#include <string>


int main()
{
  int recursionTest(int n, char c);
  int x;
  std::cin>>x;
  std::cout<<"Ans:"<<recursionTest(x,'c');

}


int recursionTest(int n,char c)
{
   int result=0;
   if(n==0)
    return 1;
   std::cout<<n<<":"<<c<<std::endl;
   result=recursionTest(n/2,'L')+recursionTest(n/3,'R');////I cant figure 
                                                           out the flow of 
                                                           control here!!!
   return result;
}

我得到了以下输出。

24
24:c
12:L
6:L
3:L
1:L
1:R
2:R
1:L
4:R
2:L
1:L
1:R
8:R
4:L
2:L
1:L
1:R
2:R
1:L
Ans:20

所以我明白了,它是一个树结构。但我仍然不知道我们如何得到 20 作为答案(输入 = 24)。求和表达式是如何工作的,求和是什么,我如何查看树结构并生成相同的输出?

Binary Tree representation of output

最佳答案

+ 运算符的两个子表达式的求值方式没有定义的顺序。编译器可以发出代码来先评估其中一个,然后再评估另一个。它甚至可以将一侧的某些计算与另一侧的计算交织在一起。例如,它可以计算 n/3,然后是 n/2,然后是右函数调用,最后是左函数调用。

流程控制就像递归的单个案例后跟另一个案例。所以,你的台词:

result=recursionTest(n/2,'L')+recursionTest(n/3,'R');

实际上等同于:

int left = recursionTest(n/2,'L');
int right = recursionTest(n/3,'R');
result = left + right;

除了在我的版本中暗示左边的函数调用保证在右边的函数调用之前被求值。

关于c++ - 当同一语句中有两个递归调用时,递归如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50571920/

相关文章:

python - 将字节数组从 C++ 传递到 Python

c++ - 迭代器有效性和线程

c++ - 使用 std::Optional 和条件的安全行为

c - 查找二维矩阵中的最大值(递归)

c++ - 查找一棵树是否为单声道(所有元素都是唯一的)的函数?

java - 斐波那契的上限

python - 在Python中使用计数器来计算斐波那契数

java - 不使用数组的斐波那契数列

c++ - 将变量从 C++ 传递到 Matlab 的快速有效方法

javascript - 递归地减去两个 JavaScript 对象