!!!!!!谁来帮解释一下这个递归调用的流程!???

来源:百度知道 编辑:UC知道 时间:2024/06/22 23:36:00
#include <stdio.h>
#include <conio.h>
fun(int k,int *p)
{
int a,b,i=1,j=1;
if(k==1||k==2)
*p=1;
else{ fun(k-1,&a);
fun(k-2,&b);
*p=a+b;
}
}
main()
{ int x;
fun(6,&x);
printf("%d\n",x);
getch();
}
我懂得简单的递归原理,例如求阶乘这类,因为它每次只调用一次自己.例如
fun(int k)
{

if(k==1)
s=1;
s=fun(k-1);
return s;
这样简单易懂,但上面那个函数,出现了两个递归调用,我就昏了,不知道他们是怎样去工作的,麻烦谁来讲解一下!??过几天就要考等级试了,我怕碰上这种题会丢分!
别复制这些过来呀,因为我都看过,我也说了我懂简单的递归.所以就打个比喻或是怎么样的也好,只要解释清楚这道题的流程就好了.别问非所答,麻烦了

这应该是个类似fibonacci求某项址
此类似fibonacci数列
a1=1,a2=1,a3=a1+a2=2,a4=a2+a3=3,a5=a4+a3=5
以此类推

比如你已开始fun(6,&x);
就是求a6

所以它先求
fun(6)= fun(5) + fun(4)
a6 = a5 + a4
以此类推

如果还有问题
可以发消息问我

你应该知道阶乘那种递归,看起来是一种层次的调用顺序,一层一层下去,在一层一层返回。

像这个调用仍然是层次的,但是每层都分了两个叉。如果你学过二叉树,这样的过程就一目了然了。

http://www.cqzxzx.cn/it/jx/jx2001/tree3.gif

调用顺序是,先调用根结点A,A中先调用了B,后调用了C,而B是先调用了D后调用了E,D是先调用了H后调用了I。于是最先完成调用的函数是H。然后调用D中第二个函数I。完毕后函数D才完成。函数D完成了才调用B中的第二个函数E…………如此下去,直到解决了A为止。

楼主知道树的先序和后序搜索么?递归就和它道理一样,遇到递归函数就进入递归过程,直到不能递归再退回上一层。

递归
递归是一种重要的编程技术。该方法用于让一个函数从其内部调用其自身。一个示例就是计算阶乘。0 的阶乘被特别地定义为 1。 更大数的阶乘是通过计算 1 * 2 * ...来求得的,每次增加 1,直至达到要计算其阶乘的那个数。

下面的段落是用文字定义的计算阶乘的一个函数。

“如果这个数小于零,则拒绝接收。如果不是一个整数,则将其向下舍入为相邻的整数。如果这个数为 0,则其阶乘为 1。如果这个数大于 0,则将其与相邻较小的数的阶乘相乘。”

要计算任何大于 0 的数的阶乘,至少需要计算一个其