请查看下面的代码,其中显示了一些基于递归的操作。我希望有人能解释一下这种递归是如何工作的?
#include <stdio.h>
int func(int);
main()
{
int ret = 0;
ret = func(6);
printf("The val is %d\n",ret);
}
int func(int m)
{
if((m==0)||(m==1))
{
return 1;
}
else
{
return (func(m-1)+func(m-2));
}
}
执行时,val的值为13.请有人解释如何在堆栈中发生此展开操作
答案 0 :(得分:6)
你不需要涉及堆叠或任何展开(不过请原谅我参与其中)。
只需用函数的内容替换调用,并继续这样做,直到你不再递归为止:
ret = func(6) =
func(5) + func(4) =
func(4) + func(3) + func(3) + func(2) =
func(2) + func(3) + func(1) + func(2) + func(1) + func(2) + func(0) + func(1) =
func(0) + func(1) + func(1) + func(2) + 1 + func(0) + func(1) + 1 + func(1) + func(0) + 1 + 1 =
1 + 1 + 1 + func(0) + func(1) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 =
3 + 1 + 1 + 8 =
3 + 2 + 8 =
13
排版有点困难,但这就是所发生的事情,答案似乎与你所得到的相符。
答案 1 :(得分:3)
递归只不过是在该特定函数中调用函数。许多数学算法或(树)搜索算法都使用这种技术来获得所需的结果。
递归函数调用需要“转义”他们重复的“自我调用”,否则应用程序将无法响应。在您的示例中,这是通过if((m==0)||(m==1))
检查完成的。如果检查为true,则函数返回1(并转义递归)。
您展示的递归代码计算Fibonacci序列,这是一种典型的递归算法,因为它需要2个先前计算的值。步骤0和1返回1
。为步骤2添加了这两个值(得到1+1=2
)。下一步将产生1+2=3
。等等。如您所见,这只能从头开始计算(因此需要递归才能这样做)
答案 2 :(得分:2)
您的程序会尝试打印Fibonacci series的第n个(或第n + 1)个数字。这里的基本案例是m =1 or m=0
这里关于递归的最糟糕的事情是一个值被计算两次,例如func(4),func(3)和func(2),如此处所示。