数据结构学习(C++)之递归(good)
http://www.yesky.com/90/1736590.shtml
对于递归的一些探讨
http://blog.csdn.net/zongxiong/archive/2006/03/23/635777.aspx
quote:
用递归的程序都可以用迭代(其实也就是循环)的方式代替,而所有的循环程序也都可以改写成递归,这
两者之间的转换只是一个程序设计难度、易读性以及程序执行效率的问题。
如何用栈实现递归与非递归的转换
http://blog.csdn.net/dragondwy/archive/2006/06/30/855391.aspx
递归函数的工作原理!
http://www.oia.com.cn/Web/CSDN/phppost5/php43338.htm
回复人: yorgo(羽高) ( ) 信誉:99 2002-06-12 13:29:37Z 得分:10
函数调用函数本身
在调用的时候将现有的环境、变量参数压入栈,然后调用函数本身
函数退出的时候,从栈顶取出压入的环境、变量参数,然后完成上一个函数的调用。直到栈为空,函数停
止运行,退出
回复人: dongfangran(东方冉) ( ) 信誉:95 2002-06-13 16:22:25Z 得分:20
清华大学出的那本〉《数据结构》 上有关栈的那一章用栈把第归说得很详细。不妨看一下。
递归函数内部的原理????不要跟我讲自己调用自己这样的话,我一分也不会给你的
http://www.csdnback.com/ForumsView/t/20020613/12/800443.html
quote:
系统根本就不管你是不是递归函数,他也不可能知道.
他只是在有函数调用的时候,把"主程序"的信息压入栈,然后调用函数,执行完后再把"主程序"的信息从
栈里弹出来,恢复.
也就是说,递归其实是一种函数调用的"技巧",只不过这种技巧很基本罢了.
呵呵,尽管你不想听到“自己调用自己”这样的话,我还是要说:就是自己调用自己的一个过程。请看下
:
void fun()
{
..
fun();
..
}
当执行到fun时,发生调用,特别的是这里是调用它本身。在函数的调用处理中,不同的语言会有
不同的处理方式,这一点在编译原理的课程中讲到的比较多,分配策略有:静态分配,栈式分配,堆式分
配三种。
在过程执行时,系统使用的一个连续存储块,称为活动记录。我现就C语言的调用特点说一下活动
记录。在C语言中,当发生函数调用时,就产生了一个过程的新的活动记录,这些信息被压入栈中保存,
以便此函数执行完毕时返回时用。当函数返回时,当前记录的内容有:
| 连接数据 |
| 返回地址 |
| 动态链 |
| 静态链 |
| 形式单元 |
| 局部数据 |
-------
针对一个C程序而言,其整体的栈分配方式为:
| main调用的函数调用的其它函数(包括自己)的活动记录|
| main调用的函数的活动记录 |
| main的活动记录 |
| 全局数据区 |
---------------------------
不知我讲明白了没有?:)
在人工实现递递归函数,并不一定要将现场数据(返回点及参数)放到栈(stack)里,我们完全可以将它们
放在可用空间更大的堆(heap)中。不过由程序自动实现时,则如上各位所说的,一定是放在stack中的
,否则编程时也不会那么容易出现‘stack overflow'错了。