3.3栈与递归的实现

来源:互联网 发布:网友见面 知乎 编辑:程序博客网 时间:2024/04/29 14:19

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

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

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

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

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

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

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

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

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

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