谁能解释下"递归的本质就是用压栈与出栈操作"?

 递归的本质就是用压栈与出栈操作

这句话感觉很有道理啊

当递归调用时每次调用自己时可以看做是压栈过程,当递归条件满足结束时,递归一级一级的返回时可以看做是出栈的过程。

函数调用的本质就是“压栈与出栈操作”,递归不过是它的特例,自身调用自身。

任何递归程序都可以改写成堆栈的形式
http://ask.csdn.net/questions/247101

我的理解是,因为每次函数调用,操作系统都会将调用函数的局部变量和下一步执行指令压入栈中,然后再把被调用函数的局部变量、程序计数器和调用函数的返回位置压入栈中。而当函数调用结束后,栈会把栈中存放被调用函数的数据弹出栈,然后又回到调用函数继续执行。递归就是函数中调用自身的过程,也和普通的函数调用一样,那么一开始不断调用就是不断地压栈,当函数开始返回时,就是不断弹出栈的过程。这里细节没说清楚,有错误欢迎指正!谢谢

首先分析 一个普通的函数中的
{ 与 } 分别做了什么事情就就知道什么是 递归 了
递归 就是新把 {全部做了 在做 }
不需要看得懂代码但是要知道意思
首先分析 { 做了什么事情
1. 提升堆栈
00401111 mov ebp,esp

00401113 sub esp,40h //40h代表的是0x40也就是堆栈的大小 这个提升的方式是 向上提升0x40个空间

2.保存寄存器
00401116 push ebx

00401117 push esi

00401118 push edi

.....................................
简单点的意思就是说 保存 调用函数之前的那些信息 目的是为了什么呢. } 的时候就清楚了
3.初始化堆栈

00401119 lea edi,[ebp-40h]

0040111C mov ecx,10h

00401121 mov eax,0CCCCCCCCh

00401126 rep stos dword ptr [edi]

//不需要看懂代码 这些代码是为了把这些堆栈的值都改成 0xC 不是 0 哦 这也就是为什么代码出错会出现CCCCCC...的原因拉
接下来分析{
1. 恢复寄存器
00401143 pop edi

00401144 pop esi

00401145 pop ebx

这时候函数的内容已经运行好了 要进行恢复 那怎么恢复呢 请看上面 { 的第2步是什么 对就是保存寄存器 这时候就是拿那些数据进行恢复
2.释放栈
00401146 add esp,40h

00401149 cmp ebp,esp

0040114B call __chkesp (00401230)

00401150 mov esp,ebp

00401152 pop ebp

00401153 ret

意思就是扔掉 不要了 也就是回收堆栈

递归可以简单理解为一个大问题分为小问题,然后小问题继续分解,直到能解决,然后几个小问题解决,就是解决一个大问题,金字塔形状最后解决所有问题,所以在分解的时候,你先分解的肯定是后被解决掉,这个过程就像是压栈的过程,后分解的,最后被分解的,最先解决,然后一层层解决了,这个就像出栈的过程。所以。。。。