与递归有关的问题

时间:2013-01-29 09:21:02

标签: c recursion

请查看下面的代码,其中显示了一些基于递归的操作。我希望有人能解释一下这种递归是如何工作的?

#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.请有人解释如何在堆栈中发生此展开操作

3 个答案:

答案 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),如此处所示。enter image description here