编程语言中,我们习惯将函数调用自身的过程称为递归,调用自身的函数称为递归函数,用递归方式解决问题的算法称为递归算法。
设计递归函数时,我们必须为它设置一个结束递归的“出口”,否则函数会一直调用自身(死循环),直至运行崩溃。接下来我们以“用递归方式求 n! ”为例,给大家展示一个正确的递归函数。
#include <stdio.h>
int factorial(int n) {
//递归的出口
if (n == 1 || n == 0) {
return 1;
}
//函数调用自身
return n * factorial(n - 1);
}
int main()
{
int n;
scanf("%d", &n);
printf("%d! = %d", n,factorial(n));
return 0;
}
递归的底层实现机制
为了方便讲解,当一个函数直接或间接调用自身时,我们将这个函数称作调用者,将直接或间接调用的自身称作被调用者。
递归函数执行时,调用者会将执行代码的权力移交给被调用者,同时还可能会向被调用者传输一些数据。此后,调用者将暂停执行,直至被调用者执行完成并将执行代码的权力交换给调用者后,它才能继续执行。
为了确保调用者能够从暂停状态继续执行,当发生递归调用时,多数编程语言都使用栈结构保存调用者的状态信息,包括暂停时局部变量的值、寄存器中保存的数据等等。
参考:http://c.biancheng.net/algorithm/recursion.html