3.3栈与递归的实现
来源:互联网 发布:网友见面 知乎 编辑:程序博客网 时间:2024/04/29 14:19
栈还有一个重要的应用是在程序设计语言中实现递归。
递归是程序设计中一个强有力的工具。其一,很多数学函数是递归定义的;其二,有些数据结构,如二叉树、广义表等,它们本身的结构有递归特性,则它们的操作可递归
地描述;其三,虽然有些问题本身没有明显的递归结构,但是利用递归比利用迭代求解更简单,如八皇后问题、Hannoi塔问题等。
在高级语言编制的程序中,调用函数和被调用函数之间的链接及信息传递需通过栈来进行。
通常,一个函数在运行时调用另一个函数,在运行被调用函数之前,系统需完成3件事:1. 将所有的实在参数、返回地址等信息传递给被调用函数;2. 为被调用函数的局部变量分配存储区;3. 将控制转移到被调用函数的入口。
同样,在被调用函数返回之前系统也完成3件工作:1. 将运算结果保存;2. 释放为其分配的数据存储区;3. 依照被调用函数保存的返回地址将控制转移到调用函数。
当有多个函数嵌套调用时,按照”后调用先返回“的原则,上述函数之间的信息传递和控制转移必须通过”栈“来完成,即系统将整个程序运行时所需要的数据空间安排在一个栈中,每当调用一个函数时,就在栈顶中分配一个存储区,每当调用结束返回时,就释放它的存储区。
同样,递归也是函数调用所以也需要一个”递归工作栈“来作为整个递归函数运行期间使用的数据存储区。每一次递归所需信息构成一个”工作记录“其中包括所有的实在参数、局部变量和返回地址等。每进入一层递归,就会产生一个新的工作记录压入栈顶。每退出一层就会从栈顶弹出一个工作记录。
补充:实际上调用和被调用函数之间不一定非要传递参数的值,也可以传递参数的地址。
递归优点:递归函数结构清晰,程序易读,而且它的正确性容易得到证明,因此,利用允许递归的语言(例如 C 语言)进行程序设计时,给用户编写程序和调试程序带来很大方便。因为,对这样一类递归问题编程时,不需要用户自己而由系统来管理递归工作栈。
- 3.3栈与递归的实现
- 3.3栈与递归的实现
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 如何用栈实现递归与非递归的转换
- 递归与尾递归的循环实现
- 树的递归与非递归实现
- 全排列的递归实现与非递归实现
- 归并排序的递归实现与非递归实现
- 归并排序的递归实现与非递归实现
- 汉诺塔的递归实现与非递归实现
- Linux如何知道当前进程的ID
- Java语言实现简单FTP软件------>连接管理模块的实现:主机与服务器之间的连接与关闭操作(八)
- C++语法基础--ostream,cout及其格式控制,缓冲区
- C++ -- 函数:引用形参
- OpenGL组件背景颜色修改
- 3.3栈与递归的实现
- 设计中的道理_3
- 电脑死机,eclipse工程出差
- 散列表 hash
- C语言数据结构----算法基本知识和静态表
- C语言运算符优先级 详细列表
- 数据结构学习笔记(2.线性表之单链表)
- Ubuntu挂载硬盘
- 关于C++ Builder中TChart的一些用法