刷题常用:递归算法,及递归的底层实现机制
编程语言中,我们习惯将函数调用自身的过程称为递归,调用自身的函数称为递归函数,用递归方式解决问题的算法称为递归算法。
设计递归函数时,我们必须为它设置一个结束递归的“出口”,否则函数会一直调用自身(死循环),直至运行崩溃。接下来我们以“用递归方式求 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