64,680
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <windows.h>
using namespace std;
int fib(int n);
int main()
{
int a;
//while(cin>>a)
//{
cout<<"the result: "<<fib(10)<<endl;
// }
return 0;
}
int fib(int n)
{
cout<<n<<endl;
if(n==1||n==2)
return 1;
else
return fib( n-1)+fib( n-2);
}
[quote=引用 3 楼 weixin_42325834 的回复:] 我也试着解释一下。fib数列的定义是:1, 1, 2, 3, 5, 8, 。。。 也就是说每个元素是前面相邻两个元素的和,而第一个和第二个元素是不符合这个定义的,因为他们前面没有两个相邻的元素,所以这两个元素直接定义为1和1 回到你的程序,n表示fib数列中的第n个元素,所以按照定义f(n) = f(n-1) + f(n-2), 而n=1和n=2的话就返回1。 比如,我们现在求第10个元素,看你的程序怎么运行的。f(10) = f(9) + f(8),首先你的程序会进一步调用f(n=9),这个函数又会去求f(9) = f(8) + f(7), 然后又去求f(8) = f(7) + f(6), 。。。这样一直到f(3) = f(2) + f(1), 而f(2)则会返回1,f(1)也会返回1,不会进一步调用了,所以f(3) = 1 + 1,返回2, 。。。这样就可以一层层返回。 这也就是递归调用的精髓所在,要求第10个,现要求第9个和第8个。问题本质一样,但是参数变小了。而要求第8个先要求第7个和第6个,进一步变小,直到小到一定程度,也就是第1个和第2个,不再依赖其它更小的元素而返回,这样前面那些元素的依赖条件满足了就可以得到答案了。
你的思路根本就不对。底归处理为了理解,可以试着一层层运行,但是这样太麻烦。只要看懂公式就可以了:这就是f函数的递推公式: fib(n)=fib(n-1)+fib(n-2), 至于fib(n-1)和fib(n-2), 它们又是利用递推计算出来的。 当n=1或者n=2的时候,fib(n)的结果直接等于1. 然后fib(3), fib(4)等等这些利用递归就可以计算出来了。 比如fib(3)= fib(2)+fib(1) = 1+ 1 = 2return fib( n-1)+fib( n-2);
函数返回值就是 return 的两个相加的结果啊? 疑问2:它递归出来的结果 怎么样相加 然后等于最终结果的,这个真的看不懂!
return fib( n-1)+fib( n-2);
这就是f函数的递推公式: fib(n)=fib(n-1)+fib(n-2), 至于fib(n-1)和fib(n-2), 它们又是利用递推计算出来的。
当n=1或者n=2的时候,fib(n)的结果直接等于1.
然后fib(3), fib(4)等等这些利用递归就可以计算出来了。
比如fib(3)= fib(2)+fib(1) = 1+ 1 = 2
疑问2:它递归出来的结果 怎么样相加 然后等于最终结果的,这个真的看不懂!
你的思路根本就不对。底归处理为了理解,可以试着一层层运行,但是这样太麻烦。只要看懂公式就可以了:这就是f函数的递推公式: fib(n)=fib(n-1)+fib(n-2), 至于fib(n-1)和fib(n-2), 它们又是利用递推计算出来的。 当n=1或者n=2的时候,fib(n)的结果直接等于1. 然后fib(3), fib(4)等等这些利用递归就可以计算出来了。 比如fib(3)= fib(2)+fib(1) = 1+ 1 = 2return fib( n-1)+fib( n-2);
函数返回值就是 return 的两个相加的结果啊? 疑问2:它递归出来的结果 怎么样相加 然后等于最终结果的,这个真的看不懂!
我也试着解释一下。fib数列的定义是:1, 1, 2, 3, 5, 8, 。。。 也就是说每个元素是前面相邻两个元素的和,而第一个和第二个元素是不符合这个定义的,因为他们前面没有两个相邻的元素,所以这两个元素直接定义为1和1 回到你的程序,n表示fib数列中的第n个元素,所以按照定义f(n) = f(n-1) + f(n-2), 而n=1和n=2的话就返回1。 比如,我们现在求第10个元素,看你的程序怎么运行的。f(10) = f(9) + f(8),首先你的程序会进一步调用f(n=9),这个函数又会去求f(9) = f(8) + f(7), 然后又去求f(8) = f(7) + f(6), 。。。这样一直到f(3) = f(2) + f(1), 而f(2)则会返回1,f(1)也会返回1,不会进一步调用了,所以f(3) = 1 + 1,返回2, 。。。这样就可以一层层返回。 这也就是递归调用的精髓所在,要求第10个,现要求第9个和第8个。问题本质一样,但是参数变小了。而要求第8个先要求第7个和第6个,进一步变小,直到小到一定程度,也就是第1个和第2个,不再依赖其它更小的元素而返回,这样前面那些元素的依赖条件满足了就可以得到答案了。
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出