一个c程序递归的问题?

来源:百度知道 编辑:UC知道 时间:2024/06/21 20:27:47
请大家帮我看看这个程序,有些地方我不懂,想问一下。
long fib(int n)
{
if(n>2)
return(fib(n-1)+fib(n-2));
else
return 2;
}
main()
{
printf("%ld\n",fib(6));
}
在printf("%ld\n",fib(6));这一语句中的fib(6)不是就是把6赋给n了吗?是不是可以这样理解 啊,那如果n是6了,那结果不就是fib(5)+fib(4)了吗?不知道我可不可这样理解啊?
还有,return(fib(n-1)+fib(n-2));这个语句 就是把fib(n-1)+fib(n-2)返回到main()里是吗?还是返回它的结果啊

你还是没把递归的执行过程弄清楚啊
下面我有的简写了执行过程,实际编译器还是更复杂一点的,但是已足以理解了

递推:
fib(6)=fib(5)+fib(4),然后分别计算fib(5)与fib(4);
fib(5)+fib(4)+fib(3);
fib(4)=fib(3)+fib(2);然后再计算fib(3)与fib(2)即可解决问题
fib(3)=fib(2)+fib(1);
而fib(2)=2;fib(1)=2;

回归:
fib(3)=4;
fib(4)=4+2=6;
fib(5)=6+4=10;
fib(6)=fib(5)+fib(4)=10+6=16;
在printf("%ld\n",fib(6));
这一语句中的fib(6)不是就是把6赋给n了吗?是不是可以这样理解 啊
答:可以这样理解,因为赋值本身就是他的拷贝,形参也是分配内存空间的
fib(6)调用这个函数,实际就是将6传递给n,n就是对6的拷贝,n是6的副本

如果n是6了,那结果不就是fib(5)+fib(4)了吗?不知道我可不可这样理解啊?
答:n是6了,结果的确是fib(5)+fib(4)的值了,的确是这样,但是你要知道fib(5)+fib(4)的值,就是求fib(5)+fib(4)的值.因此你就又需要调用fib(5)与fib(4),求出他俩的值,然后相加.得到fib(6)的值.而求fib(6)的值,即是调用函数fib(n),此时传递给n的值是5,同理,后面的一样

还有,return(fib(n-1)+fib(n-2));这个语句 就是把fib(n-1)+fib(n-2)返回到main()里是吗?还是返回它的结果啊
答:是返回它的计算结果值

对,是返回fib(n-1)+fib(n-2)执行结束后的返回值.

6是实参,fib(6)的意思是把6传递给形参,也就是n现的值是6,按照你那样理解也可以.
return(fib(n-1)+fib(n-2));是把fib(n-1)+fib(n-2)的结