Recursion 简单英语中的递归函数

Recursion 简单英语中的递归函数,recursion,Recursion,可能重复: 有人能用简单的英语解释一下递归函数的实际功能吗 如果你举一个例子就好了。三个词-它调用自己递归函数是根据自身定义的。实际上,它意味着它在实现中调用自己 简单的示例根据前面的值定义一个带有停止点的序列 long factorial(long n) { if (n <= 1) // stopping point. return 1; return n * factorial(n - 1); } long fibonacci(long n) {

可能重复:

有人能用简单的英语解释一下递归函数的实际功能吗


如果你举一个例子就好了。

三个词-它调用自己

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

简单的示例根据前面的值定义一个带有停止点的序列

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);
}
长阶乘(长n){

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

如果您不能确保某一组参数停止它,它将永远调用自己,否则您将导致堆栈溢出。:-)

C#中的一个简单示例如下:

void printPositionEnumbersBackwards(整数)
{
//这是一个停止递归的条件
如果(数字==0)
回来
控制台写入线(编号);
//这是函数调用自身的地方,
//使用不同的(较小的)输入参数
反向打印(数字-1);
}
来自维基百科:

普通英语中的递归

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

要理解递归,必须认识到过程和过程运行之间的区别。过程是根据一组规则采取的一组步骤。过程的运行包括实际遵循规则并执行步骤。一个过程可能类似于一本烹饪书,因为它是可能的步骤,而运行一个程序实际上是在准备饭菜

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

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

Recursion

    See "Recursion".
这个笑话的一个变体是:

Recursion

    If you still don't get it, see: "Recursion".

一旦读取器“得到它”,它实际上就终止了。

递归函数是根据自身定义的,但应用于“更简单的参数或数据”。如果这是“更简单的数据”是平凡的,可以在不调用自身的情况下对函数求值,从而破坏递归,否则递归将是无限的。一个经典示例是阶乘函数:

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

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

下面的函数调用自己10次

int level = 0;
int call_me() {
  if( level < 10 )
    level++;
    call_me();
  else
    ; // "Exit here"
}
int-level=0;
int call_me(){
如果(级别<10)
级别++;
叫我();
其他的
;/“从这里退出”
}

递归函数本身调用。(大量示例)。要理解递归,您必须首先理解递归。还有一点很好:…您以前真的搜索过吗?根据这种逻辑,第一个常见的笑话应该是
无限递归的定义(参见编号:)对该笑话的评价较高。如果您使用优化的尾部递归,您不会出现堆栈溢出错误。调试非常困难。(这就是为什么你应该总是在调试模式下禁用优化。)@WTP:没错,我只是稍微修改了那部分。我想提到尾部递归,但我想保持简单。
int level = 0;
int call_me() {
  if( level < 10 )
    level++;
    call_me();
  else
    ; // "Exit here"
}