简单英语中的递归函数

时间:2011-09-11 08:41:12

标签: recursion

  

可能重复:
  Understanding recursion

有人能用简单的英语解释一下递归函数究竟是做什么的吗?

如果你用一个例子说,那就好了。

6 个答案:

答案 0 :(得分:7)

三个字 - 自称

答案 1 :(得分:5)

这是一个自我调用的函数,通常在每次迭代中使用不同的参数集。在大多数情况下,它会重复调用自身,直到有一组输入参数将“停止”。

如果你不确定某个参数集会阻止它,它会永远调用它自己,否则你最终会出现堆栈溢出。 : - )

C#中的一个简单例子就是:

void PrintPositiveNumbersBackwards(int number)
{
    // this is a condition which stops the recursion
    if (number == 0)
       return;

    Console.WriteLine(number);

    // this is where the function calls itself,
    // with a different (smaller) input parameter
    PrintPositiveNumbersBackwards(number - 1);
}

答案 2 :(得分:2)

递归函数是根据自身定义的。实际上,它意味着它在实现中调用自己。

简单示例根据具有停止点的先前值定义一系列。

long factorial(long n) {
    if (n <= 1) // stopping point.
      return 1;
    return n * factorial(n - 1);
}

long fibonacci(long n) {
    if (n <= 2) // stopping point.
      return 1;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

递归函数可以是一种解决问题的优雅方法,并且代表数学定义,但是在大多数命令式编程语言中,如您提到的那样,使用循环更有效。

long factorial(long n) {
   long product = 1;
   for(long i = 2; i <= n; i++) 
       product *= i;
   return product;
}

long fibonacci(long n) {
   long a = 0, b = 1, c = 1;
   for(int i=1; i<n; i++) {
      a = b;
      b = c;
      c = a + b;
   }
   return c;
}

答案 3 :(得分:2)

来自维基百科:

简单英语递归

递归是当过程的一个步骤涉及调用过程本身时过程经历的过程。经历递归的过程被称为“递归”。

要理解递归,必须认识到过程与过程运行之间的区别。过程是基于一组规则要采取的一组步骤。程序的运行涉及实际遵循规则和执行步骤。一个类比可能是一个程序就像一本食谱,因为它是可能的步骤,而运行一个程序实际上正在准备这顿饭。

递归与执行某些其他过程的过程规范中的引用相关,但不相同。例如,配方可能指的是烹饪蔬菜,这是另一种需要加热水的过程,等等。但是,递归过程的特殊之处在于(至少)其中一个步骤调用了同一过程的新实例。这当然会立即产生无限循环的危险;如果在某些情况下跳过相关步骤以便该过程可以完成,则递归只能在定义中正确使用。即使正确定义,递归过程对于人类来说也不容易执行,因为它需要区分新的(部分执行的)过程的调用;这需要对程序的各种同时实例进展到多远进行一些管理。因此,递归定义在日常情况下非常罕见。一个例子可以是以下程序来寻找通过迷宫的方法。继续前进直到到达出口或分支点(死角被认为是具有0个分支的分支点)。如果达到的点是退出,则终止。否则依次尝试每个分支,递归使用该过程;如果每次试验都只通过达到死胡同而失败,那么返回导致这个分支点的路径并报告失败。这实际上是否定义了终止过程取决于迷宫的性质:它不能允许循环。在任何情况下,执行该过程都需要仔细记录所有当前已探索的分支点,以及哪些分支已经详尽地尝试过。 递归幽默

一个常见的笑话是递归的以下“定义”。

Recursion

    See "Recursion".

这个笑话的一个变种是:

Recursion

    If you still don't get it, see: "Recursion".
只要读者“得到它”,它就会终止。

答案 4 :(得分:0)

递归函数是根据自身定义的,但适用于“更简单的参数或数据”。如果这个“更简单的数据”是微不足道的,那么可以在不调用自身的情况下评估函数,从而打破递归,否则这将是无限的。一个典型的例子是阶乘函数:

n! = (n-1)! * n, if n > 0    (recursion case)
0! = 1                       (termination)

答案 5 :(得分:-1)

递归函数调用自身。然而,这可能导致一种“无限循环”(和堆栈溢出)。因此,一旦达到所需的递归级别,该函数需要测试条件并通过不再自己进行另一次调用来“退出”。

以下函数自行调用10次。

int level = 0;
int call_me() {
  if( level < 10 )
    level++;
    call_me();
  else
    ; // "Exit here"
}