3.3栈与递归的实现

栈还有一个重要的应用是在程序设计语言中实现递归。

递归是程序设计中一个强有力的工具。其一,很多数学函数是递归定义的;其二,有些数据结构,如二叉树、广义表等,它们本身的结构有递归特性,则它们的操作可递归

地描述;其三,虽然有些问题本身没有明显的递归结构,但是利用递归比利用迭代求解更简单,如八皇后问题、Hannoi塔问题等。

在高级语言编制的程序中,调用函数和被调用函数之间的链接及信息传递需通过栈来进行。

通常,一个函数在运行时调用另一个函数,在运行被调用函数之前,系统需完成3件事:1.  将所有的实在参数、返回地址等信息传递给被调用函数;2. 为被调用函数的局部变量分配存储区;3. 将控制转移到被调用函数的入口。

同样,在被调用函数返回之前系统也完成3件工作:1. 将运算结果保存;2. 释放为其分配的数据存储区;3. 依照被调用函数保存的返回地址将控制转移到调用函数。

当有多个函数嵌套调用时,按照”后调用先返回“的原则,上述函数之间的信息传递和控制转移必须通过”栈“来完成,即系统将整个程序运行时所需要的数据空间安排在一个栈中,每当调用一个函数时,就在栈顶中分配一个存储区,每当调用结束返回时,就释放它的存储区。

同样,递归也是函数调用所以也需要一个”递归工作栈“来作为整个递归函数运行期间使用的数据存储区。每一次递归所需信息构成一个”工作记录“其中包括所有的实在参数、局部变量和返回地址等。每进入一层递归,就会产生一个新的工作记录压入栈顶。每退出一层就会从栈顶弹出一个工作记录。

补充:实际上调用和被调用函数之间不一定非要传递参数的值,也可以传递参数的地址。

递归优点:递归函数结构清晰,程序易读,而且它的正确性容易得到证明,因此,利用允许递归的语言(例如 C 语言)进行程序设计时,给用户编写程序和调试程序带来很大方便。因为,对这样一类递归问题编程时,不需要用户自己而由系统来管理递归工作栈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值