C语言实现递归的基本原理( 二 )


Figure 3.3. The stack of a C program while computing 4! recursively
一旦当n=1时的活跃期结束,n=2时的递归计算结果就是2×1=2,因而n=2时的活跃期也将结束,返回值为2(见图3-3,第5步) 。结果就是n=3时的递归计算结果表示为3×2=6,因此n=3时的活跃期结束,返回值为6(见图3-3,第6步) 。最终,当n=4时的递归计算结果将表示为6×4=24,n=4时的活跃期将结束,返回值为24(见图3-3,第7步) 。此时,函数已经从最初的调用中返回,递归过程结束 。
栈是用来存储函数调用信息的绝好方案,这正是由于其后进先出的特点(见第6章)精确满足了函数调用和返回的顺序 。然而,使用栈也有一些缺点 。栈维护了每个函数调用的信息直到函数返回后才释放,这需要占用相当大的空间,尤其是在程序中使用了许多递归调用的情况下 。除此之外,因为有大量的信息需要保存和恢复,因此生成和销毁活跃记录需要耗费一定的时间 。如此一来当函数调用的开销变得很大时,我们就需要考虑应该采用迭代的方案 。幸运的是,我们可以采用一种称为尾递归的特殊递归方式来避免前面提到的这些缺点 。




推荐阅读