数据结构-递归和堆栈
来源:互联网 发布:用源码搭建网站教程 编辑:程序博客网 时间:2024/06/06 23:56
本文转载http://blog.csdn.net/feixiaoxing/article/details/6838773
看过我前面博客的朋友都清楚,函数调用主要依靠ebp和esp的堆栈互动来实现的。那么递归呢,最主要的特色就是函数自己调用自己。如果一个函数调用的是自己本身,那么这个函数就是递归函数。
我们可以看一下普通函数的调用怎么样的。试想如果函数A调用了函数B,函数B又调用了函数C,那么在堆栈中的数据是怎么保存的呢?
- 函数A ^
- 函数B | (地址递减)
- 函数C |
- int iterate(int value)
- {
- if(value == 1)
- return 1;
- return value + iterate(value -1);
- }
- void process()
- {
- int value = iterate(6);
- }
- iterate(int 1) line 96
- iterate(int 2) line 97 + 12 bytes
- iterate(int 3) line 97 + 12 bytes
- iterate(int 4) line 97 + 12 bytes
- iterate(int 5) line 97 + 12 bytes
- iterate(int 6) line 97 + 12 bytes
- process() line 102 + 7 bytes
- main() line 108
- mainCRTStartup() line 206 + 25 bytes
- KERNEL32! 7c817067()
看到这里,大家可能感到递归函数不过如此,事实上也是这样。但是,还有一点大家需要牢记在心,递归的深度是我们必须考虑的一个问题。只有递归深度在一个可控的范围内,那么整个递归过程都是可控的。那什么时候不可控呢?那就是递归深度超过了一定的数字?这个数字和具体的线程堆栈长度有关?等到堆栈溢出了,那么获得的数据已经失去了真实性,所以也就没有意义了。
我们把上面的问题推广一下,如何用自己定义的堆栈模拟上面的递归调用呢?这样既能满足递归的属性,又能确保函数深度可控。
大家可以先写一下自己的方案,下面只是我个人的一个思路。
- int iterate(int value)
- {
- int count = 0;
- int number =0;
- push(value);
- while(-1 != (number = pop()))
- {
- if(1 != number)
- push(number -1);
- count += number;
- }
- return count;
- }
0 0
- 数据结构-递归和堆栈
- 算法与数据结构学习 03 递归和堆栈
- 内存堆栈和数据结构堆栈
- 内存堆栈和数据结构堆栈
- python算法和数据结构笔记--汉诺塔问题超详细递归过程图解(堆栈数据结构)
- 数据结构-堆栈和队列
- 【数据结构】堆栈和队列
- 数据结构--堆栈和队列
- 数据结构堆栈和队列
- 数据结构堆栈和队列
- 数据结构-堆栈和队列
- 数据结构中的堆栈和内存中的堆栈
- 数据结构的堆栈和内存中的堆栈
- 数据结构的堆栈和内存的堆栈
- Java数据结构--------堆栈和队列
- java 数据结构----------堆栈和队列
- 数据结构-循环和递归
- VC++2012编程演练数据结构《5》堆栈实现递归运算
- TextSwitcher的使用(一)
- 字符串分割函数strtok的实现
- 关于条码纠错
- 程序各种段的总结理解
- -3+1
- 数据结构-递归和堆栈
- Openstack 1:配置开发环境 Setting Up a Development Environment
- 协调作用域不同步的Bean
- 黑马程序员_java编程基础1
- mac上安装MySQL
- 红黑树之删除操作
- 番茄花园网站软件侵权案【侵犯著作权罪】
- J2EE 初识DetachedCriteria查询
- k-means & isodata 聚类方法