答案 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"
}