一段话中的几处不理解的地方,望知晓的醍醐灌顶
栈是用来存储函数调用信息的绝好方案,这正是由于其后进先出的特点精确满足了函数调用和返回的顺序(这句话怎么理解)。然而,使用栈也有一些缺点。栈维护了每个函数调用的信息直到函数返回后才释放,这需要占用相当大的空间,尤其是在程序中使用了许多递归调用的情况下。除此之外,因为有大量的信息需要保存和恢复,因此生成和销毁活跃记录需要耗费一定的时间(还有这句话)。如此一来当函数调用的开销变得很大时,我们就需要考虑应该采用迭代的方案。
[解决办法]
递归的话需要保存很多信息,往栈里压数据,所以很消耗空间
[解决办法]
第一句话:
函数调用时,调用函数会将被调用函数的下一条指令地址入栈。进入被调用函数后,将栈基地址压栈,将栈顶指针赋给栈基地址(实现栈帧转换)。函数调用结束后,将栈基地址(被调用函数栈基地址)赋给栈顶指针,此时栈顶指针指向调用函数的栈基地址,根据后进先出原则,首先将该值弹出后栈帧恢复为调用前状态,然后再弹出被调用函数的下一条指令地址,程序向下执行。
第二句话:
由于递归调用为嵌套的函数调用,在函数没有执行完毕返回时,又进行了函数调用。这就会使得栈帧叠加,这种方式会持续压栈而不弹栈造成栈的生长,直到递归条件不满足,才会一层层的弹栈。因此会有占用空间大的缺点。
[解决办法]
这几句话已经非常明确了,lz之所以不懂,是因为背景知识不够,建议楼主下载
下面这本书,认真阅读前几章,自然就懂了。
http://download.csdn.net/detail/zhou19891113/3032586
[解决办法]
如果我没记错,这是《算法精解:C语言描述》里的话。书里面画了递归的递推和回归过程栈的变化,对着图看该不难理解。
[解决办法]
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出