第1个回答 2019-03-17
从主函数fun(6,&x)开始调用。调用的时候,实参6和&x将自身的值传递给形参n,s,接着,开始执行fun函数体内的语句第一次调用:判断if(n==0||n==1),此时的n值为6,不满足条件,执行else部分语句。 fun(n-1,&f1);fun(n-2,&f2);先调用fun(n-1,&f1);而fun(n-2,&f2);需要当fun(n-1,&f1);符合if条件以后才轮到它执行第二次调用:此时,形参n=6转变为实参n,fun(n-1,&f1)等价于fun(5,&f1),继续判断,if(n==0||n==1),又不满足条件,于是,重复之前的操作,转向else部分执行。 fun(n-1,&f1);fun(n-2,&f2);此时的n=5,同样是先调用fun(n-1,&f1);后面那个fun(n-2,&f2);同样处于等待状态,等待前面的 fun(n-1,&f1);符合IF条件后才轮到它执行,于是,fun(n-1,&f1);就这样一层一层执行下去,每执行一次,n的值减一,当n=1的时候,执行if部分,这时,便可以在fun(n-1,&f1);执行完毕只有继续执行fun(n-2,&f2);,接着,返回前一次调用的状态,开始执行fun(n-2,&f2);比如当n=2的时候,执行完fun(2-1=1,&f1)以后,便开始执行fun(2-2=0,&f2);和它后面的语句,最终,函数返回上一次调用的状态,即fun(3,&f1);此时,fun(3,&f1)已经执行完毕,因为之前我们已经把fun(2,&f1)执行完了,接着,应该执行的是fun(3-2=1,&f2);当这个函数最后终也符合if部分要求,又返回到前面的fun(4,&f1),执行完后,开始执行fun(4,&f2),这样一个流程。通常来说,递归可以简化代码,但同时也会增加系统开销并且让程序阅读的时候要比正常的顺序程序难以理解一些。不过,现代的硬件飞速发展,用递归是完全可以的。