C++ 难以理解C+上的递归+;

C++ 难以理解C+上的递归+;,c++,recursion,C++,Recursion,我有一个我试图复制的示例代码块,一个用于查找斐波那契数的递归函数 #include <iostream> using namespace std; int fibonacci(int n) { if (n==0) return 0; else if (n==1) return 1; else return fibonacci(n-1)+(n-2); } int main() { cout<<fibonacci(15); } 执行时 现在看一些例子,我发现公式是

我有一个我试图复制的示例代码块,一个用于查找斐波那契数的递归函数

#include <iostream>

using namespace std;

int fibonacci(int n)
{
if (n==0)
 return 0;
else if (n==1)
 return 1;
else return fibonacci(n-1)+(n-2);
}

int main()
{
cout<<fibonacci(15);
}
执行时


现在看一些例子,我发现公式是错误的,但我仍然好奇为什么输出是这样,因为我一直在努力理解递归是如何工作的。

你应该把前面两个斐波那契数相加,所以
斐波那契(n-1)+斐波那契(n-2)
,而不是
斐波那契(n-1)+(n-2)
,它缺少函数调用。使用
fibonacci(n-1)+(n-2)
,您只需将
n-2
添加到序列中的前一个项中,就可以得到一个类似于三角数的序列。

与其他用户发布的一样,您缺少
(n-2)
部分的函数调用

至于递归是如何工作的,请将其视为一个。对于每个函数调用,堆栈上的当前状态都会被保存,并且您会将程序计数器移动到函数调用;恰好它也是您所处的当前函数。当您到达树的底部时,您将解开堆栈

这将返回正确答案:

#include <iostream>

using namespace std;

int fibonacci(int n)
{
if (n==0)
    return 0;
else if (n==1)
    return 1;
else 
    return fibonacci(n-1)+fibonacci(n-2);
}

int main()
{
    cout<<fibonacci(15);
}
#包括
使用名称空间std;
整数斐波那契(整数n)
{
如果(n==0)
返回0;
else如果(n==1)
返回1;
其他的
返回斐波那契(n-1)+斐波那契(n-2);
}
int main()
{
可能是这样的

#include <iostream>
using namespace std;

int fibonacci(int n)
{
  if (n==0) //base case
    return 0;
  else if (n==1) //base case
    return 1;
  else return fibonacci(n-1)+ fibonacci(n-2);
}

int main()
{
    cout<<fibonacci(15);
}
#包括
使用名称空间std;
整数斐波那契(整数n)
{
如果(n==0)//基本情况
返回0;
else如果(n==1)//基本情况
返回1;
否则返回fibonacci(n-1)+fibonacci(n-2);
}
int main()
{

coutTip:在一张纸上画一棵递归树来找出它是如何工作的。如果你使用调试器来逐步调试代码,它将帮助你非常快地理解递归的工作原理。因此,放一个
cout1)递归有什么不清楚的地方?
fibonacci(n-1)+(n-2);
相当于
fibonacci(n-1)+n-2;
所以,它基本上等于
15+14+13+12+11+10+9+8+7+6+5+4+3+2+1-2*14,或者更一般地说:
sum(n)-2*(n-1)
还有什么不清楚的地方?这是了解堆栈工作原理的最佳时机。应该注意的是,这具有指数级的时间复杂度,是实际计算斐波那契数的最昂贵的方法之一。像
斐波那契(42)这样简单的方法
只会导致10亿次递归调用。
#include <iostream>
using namespace std;

int fibonacci(int n)
{
  if (n==0) //base case
    return 0;
  else if (n==1) //base case
    return 1;
  else return fibonacci(n-1)+ fibonacci(n-2);
}

int main()
{
    cout<<fibonacci(15);
}