2 u013179958 u013179958 于 2016.04.06 14:44 提问

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

这句话感觉很有道理啊

7个回答

beifengche
beifengche   2016.04.06 17:06
已采纳

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

qinjisheng_11
qinjisheng_11   2016.04.06 19:15

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

caozhy
caozhy   Ds   Rxr 2016.04.06 14:45

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

caozhy
caozhy   Ds   Rxr 2016.04.06 14:47

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

u014517002
u014517002   2016.04.06 15:07

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

qq_32680341
qq_32680341   2016.04.06 15:09

首先分析 一个普通的函数中的
{ 与 } 分别做了什么事情就就知道什么是 递归 了
递归 就是新把 {全部做了 在做 }
不需要看得懂代码但是要知道意思
首先分析 { 做了什么事情
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

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

CSDNXIAON
CSDNXIAON   2016.04.06 20:51

每天一算法(进栈,出栈,栈中最小值)
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
递归方法的压栈和出栈(个人理解)
1.常见的很容易理解的求阶层 package ee; import java.util.Scanner; public class Rucursive { int sum=1; public int compute(int n) { if(n==0) { return 1; } return sum=n*compute(--n); } public s
理解递归的本质:递归与栈
递归的基本思想所谓递归,就是有去有回。递归的基本思想,是把规模较大的一个问题,分解成规模较小的多个子问题去解决,而每一个子问题又可以继续拆分成多个更小的子问题。最重要的一点就是假设子问题已经解决了,现在要基于已经解决的子问题来解决当前问题;或者说,必须先解决子问题,再基于子问题来解决当前问题。或者可以这么理解:递归解决的是有依赖顺序关系的多个问题。我们假设一个抽象问题有两个时间点要素:开始处理,结...
压栈和入栈的过程
压栈过程: 出栈过程:
函数在实现过程内存中的压栈和出栈
关于函数在调用过程中的压栈和出栈问题在学习的时候就感觉很经典,对程序的把握可以提升一个台阶。    一.首先让我们写出一个简单的函数。(我是在vc6.0中实现,并不表示vs编译器底下不可以实现)。    #include        int add(num1,num2)    {    int ret = 0;    ret = num1+num2;    return ret;    }   
汇编 压栈出栈
一 PS:EBP是当前函数的存取指针,即存储或者读取数时的指针基地址;ESP就是当前函数的栈顶指针。每一次发生函数的调用(主函数调用子函数)时,在被调用函数初始时,都会把当前函数(主函数)的EBP压栈,以便从子函数返回到主函数时可以获取EBP。 下面是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码 假设执行函数前堆栈指针ESP为0xAAAA
顺序栈的压栈和出栈
#include using namespace std; const int StackSize=10; class SeqStack { public: SeqStack( ) //构造函数,初始化一个空栈 {top=-1;} ~SeqStack( ) { } //析构函数为空 void Push( int x ) //入栈
压栈出栈
#include<stdio.h> #include<stdlib.h> #define ERROR 0 #define NULL 0 #define maxSize 100 #define OK 1typedef struct { int *top; int *base; int size; }stack;int initStack(stack &s) { if(
C 程序局部变量压栈出栈的理解
写这篇总结的缘由仅仅出于巧合,五一前帮一位同学看51的程序,在查看汇编代码的时候(事实上我当时的汇编知识基本都还给了老师),无意中问起我“某个局部变量的声明怎么没有对应的汇编语句”,我没有答出来。当时也只是把它当做一种常识给记了下来,平时不论还是在DSP、16位的单片上还是PC平台上编写c程序,由于程序不是很复杂且芯片资源通常足够,因此很少会考虑内存分配、堆栈方面的内容。这几天在看《Linux
C++ 简单实现压栈出栈
/********************************************************************** * Copyright (c)2015,WK Studios * Filename: stack.h * Compiler: GCC,VS,VC6.0 win32 * Author:WK * Time: 2015 3 29
Java 实例 - 压栈出栈的方法实现字符串反转
以下实例演示了使用用户自定义的方法 StringReverserThroughStack() 来实现字符串反转: 转载于http://www.runoob.com/java/data-reverse.html import java.io.IOException;public class StringReverserThroughStack { private String input;