1. 递归介绍
- 分支转向是算法的灵魂;
- 函数和过程及其之间的相互调用,是在经过抽象和封装之后,实现分支转向的一种重要机制,而递归则是函数和过程调用的一种特殊形式,即允许函数和过程进行自我调用;
- 递归函数是一种可以调用自身的函数,每次成功的调用都使得输入变得更加精细,使我们越来越接近问题的答案;
- 递归也是一种基本而典型的算法设计模式,这一模式可以对实际问题中反复出现的结构和形式做高度概括,并从本质上加以描述与刻画,进而导出高效的算法。
##2. 递归的实现
为了理解递归究竟是如何工作的,下面看一下关于C程序在内存中的组织方式。一般一个可执行的程序由4个区域组成:代码段、静态数据区、堆和栈。当C程序中调用了一个函数时,栈会分配一块空间来保存与这个调用相关的信息。每一个调用都被当做活跃的。栈上的那块存储空间称为活跃记录,或者称为栈帧。 栈帧由5个区域组成:输入参数、返回值空间、计算表达式时用到的临时存储空间、函数调用时保存的状态信息以及输出参数。
栈是用来存储函数调用信息的绝好方案,这正是由于其后进先出的特点精确满足了函数调用和返回的顺序。然而栈也有缺点,栈维护了每个函数调用的信息知道函数返回后,才释放,这需要相当大的空间,尤其在程序中使用了许多递归的调用的情况。
但是我们可以采用一种尾递归的方式来避免前面提到的缺点。
同样以n的阶乘为例,其递推公式为 : 初始a&#