请各位高手帮我分析这道题的答案为什么是8

来源:百度知道 编辑:UC知道 时间:2024/05/22 04:41:43
fun(int n, int *s)
{int f1, f2 ;
if ( n==1 || n==2 ) *s=1 ;
else
{ fun (n-1, &f1 ) ;
fun (n-2, &f2) ;
*s=f2+f1 ;
}
}
main( )
{int x ;
fun( 6 , &x) ;
printf( "%d \n" , x) ;
}
能帮我分析一下递归执行过程吗

斐波那契数列问题,前两项为1,1,后面每项都是其前两项的和。
1,1,2,3,5,8,(第6项为8)
过程请等一下,我发给你

fun(6,&x) 返回8 =其下面的fun(5,&x)+fun(4,&x)
fun(5,&x) 返回5 =其下面的fun(4,&x)+fun(3,&x)
fun(4,&x) 返回3 =其下面的fun(3,&x)+fun(2,&x)
fun(3,&x) 返回2 =其下面的fun(2,&x)+fun(1,&x)
fun(2,&x) 返回1 (直接返回)
fun(1,&x) 返回1 (直接返回)
fun(2,&x) 返回1
fun(3,&x) 返回2 =其下面的fun(2,&x)+fun(1,&x)
fun(2,&x) 返回1 (直接返回)
fun(1,&x) 返回1 (直接返回)
fun(4,&x) 返回3 =其下面的fun(3,&x)+fun(2,&x)
fun(3,&x) 返回2 =其下面的fun(2,&x)+fun(1,&x)
fun(2,&x) 返回1 (直接返回)
fun(1,&x) 返回1 (直接返回)
fun(2,&x) 返回1 (直接返回)

向右缩进多少表示其递归层次,比如:
fun(3,&x) 返回2 =其下面的fun(2,&x)+fun(1,&x)
fun(2,&x) 返回1 (直接返回)
表示fun(2,&x)被fun(3,&x)调用。
由于无法用树状表示,只好表示成这样,请参考

请看一下百度Hi,那里更清楚一点。

fun(int n, int *s) 是斐波那契数列的递归函数
写个比较小的书吧,假设是fun(4,&x)
将n=4代入,则输出的是X的值,因为n=4,所以执行else里的内容
fun(3,f1),fun(2,f2),x=f1+f2 ,先看后面的
fun(2,f2),因为传入的n为2,则f2=1,因为fun(3,f1)中的n=3,则还得继续递归,执行