栈与递归
来源:互联网 发布:linux环境变量设置 编辑:程序博客网 时间:2024/04/29 08:44
在高级语言中,调用自己和其他函数并没有本质的不同。我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数。
对比了两种实现斐波那契的代码。迭代和递归的区别是:迭代使用的是循环结构,递归使用的是选择结构。
- 递归能使程序的结构更清晰、更简洁、更容易让人理解,从而减少读懂代码的时间。但是大量的递归调用会建立函数的副本,会耗费大量的时间和内存。
- 迭代则不需要反复调用函数和占用额外的内存。因此我们应该视不同 情况选择不同的代码实现方式。
那么我们讲了这么多递归的内容,和栈有什么关系呢?这得从计算机系统的内部说起。
这种存储某些数据,并在后面又以存储的逆序恢复这些数据,以提供之后使用的需求,显然很符合栈这样的数据结构,因此,编译器使用栈实现递归就没什么好惊讶的了。
简单的说,就是在前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地址都被压入栈中。在退回阶段,位于栈顶的局部变量、参数值和返回地址被弹出,用于返回调用层次中执行代码的其余部分,也就是恢复了调用的状态。
#include "stdio.h"int main(){ int n; int f(int m); printf("请输入一个大于1的数:"); scanf("%d",&n); printf("%d\n",f(n)); return 0;}int f(int m){ if(m==1) return 1; else { printf("m=%d\n",m); //每当m!=1的时候就不断地调用int f(int m),直到m==1为止 return f(m-1); }}
程序执行结果
请输入一个大于1的数:5m=5m=4m=3m=21
当然,对于现在的髙级语言,这样的递归问题是不需要用户来管理这个栈的,一切都由系统代劳了。
转自http://www.nowamagic.net/librarys/veda/detail/2300 有动画演示
0 0
- 栈与递归
- 栈与递归
- 栈与递归-汉诺塔
- 浅谈栈与递归
- 递归与栈
- 栈与递归
- 栈与递归
- 递归与栈
- 栈与递归
- 栈与递归
- 递归与栈
- 栈(3)--栈与递归
- 数据结构笔记-----递归与栈
- 专题四-栈与递归
- 13_递归与栈
- 递归与非递归
- 递归与尾递归
- 递归与尾递归
- 进入appstore中指定的应用
- Java SSH框架学习
- 《健康报》携手健康之路帮助医院医生免费搭建微官网
- Cocos2dx-Android初体验
- cocos2dx --- VS 使用utf8 编码问题
- 栈与递归
- Oracle 与 DB2 数据类型分类对应说明
- 堆排
- 微信订阅号和服务号的区别
- 深入浅出Java三大框架SSH与MVC的设计模式
- 54655
- SQLite学习笔记六: 约束NOT NULL,DEFAULT,UNIQUE,PRIMARY KEY, CHECK
- 整洁的 Table View 代码
- 最近真的比较烦