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章)精确满足了函数调用和返回的顺序 。然而,使用栈也有一些缺点 。栈维护了每个函数调用的信息直到函数返回后才释放,这需要占用相当大的空间,尤其是在程序中使用了许多递归调用的情况下 。除此之外,因为有大量的信息需要保存和恢复,因此生成和销毁活跃记录需要耗费一定的时间 。如此一来当函数调用的开销变得很大时,我们就需要考虑应该采用迭代的方案 。幸运的是,我们可以采用一种称为尾递归的特殊递归方式来避免前面提到的这些缺点 。
推荐阅读
- 用PHP如何实现页面静态化
- 玛雅预言世界末日2012已证实 玛雅人预言2012年世界末日为什么没有实现
- 玛雅第五个预言为什么没有实现 玛雅人的五大预言最后一个为什么没有成功
- 启元世界:打造AI决策智能体,用小样本实现10的26次方复杂空间决策
- rsync实现 linux与windows备份同步
- 在PyTorch中使用深度自编码器实现图像重建
- JavaScript的深拷贝实现
- 加拿大情人节,普洱茶茶源广场茶叶交易总额实现14
- CentOS7下利用Google Authenticator实现SSH登录的二次身份验证
- 实战基于Redis实现阻塞队列