递归与堆栈

#include<stdio.h>
#include<iostream>
int  fact(int n) {
    if (n == 1)
        return 1;
    return n * fact(n - 1);
}
int main()
{
    int a;
    std::cin >> a;
    fact(a);
    return 0;
}//记得我大一第一次学习C语言的时候,学到递归那点怎么也想不明白,老师也不给讲明白。不过如果
//能从反汇编的角度来看,可能会容易理解一下。
     8: int main()
     9: {
01045320 55                   push        ebp
01045321 8B EC                mov         ebp,esp
01045323 81 EC D0 00 00 00    sub         esp,0D0h
01045329 53                   push        ebx
0104532A 56                   push        esi
0104532B 57                   push        edi
0104532C 8D BD 30 FF FF FF    lea         edi,[ebp-0D0h]
01045332 B9 34 00 00 00       mov         ecx,34h
01045337 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
0104533C F3 AB                rep stos    dword ptr es:[edi]
0104533E A1 00 F0 04 01       mov         eax,dword ptr ds:[0104F000h]
01045343 33 C5                xor         eax,ebp
01045345 89 45 FC             mov         dword ptr [ebp-4],eax
    10:     int a;
    11:     std::cin >> a;
01045348 8B F4                mov         esi,esp
0104534A 8D 45 F4             lea         eax,[a]
0104534D 50                   push        eax
0104534E 8B 0D 90 00 05 01    mov         ecx,dword ptr ds:[1050090h]
01045354 FF 15 94 00 05 01    call        dword ptr ds:[1050094h]
0104535A 3B F4                cmp         esi,esp
0104535C E8 7E BF FF FF       call        __RTC_CheckEsp (010412DFh)
    12:     fact(a);
01045361 8B 45 F4             mov         eax,dword ptr [a]
01045364 50                   push        eax
01045365 E8 FA BC FF FF       call        fact (01041064h)
0104536A 83 C4 04             add         esp,4
    13:     return 0;
0104536D 33 C0                xor         eax,eax  

https://blog.csdn.net/zr_lang/article/details/39962679

原文地址:https://www.cnblogs.com/binanry/p/9742219.html

时间: 2024-11-18 17:52:58

递归与堆栈的相关文章

快速排序递归非递归队列堆栈实现

递归实现 #include<iostream> using namespace std; template <class T> void QuickSort(T A[],int left,int right) { if(left<right) { int i=left; int j=right+1; do { do i++;while(A[i]<A[left]); do j--;while(A[j]>A[left]); if(i<j) Swap(A[i],A

一步一步写算法(之递归和堆栈)

原文:一步一步写算法(之递归和堆栈) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 看过我前面博客的朋友都清楚,函数调用主要依靠ebp和esp的堆栈互动来实现的.那么递归呢,最主要的特色就是函数自己调用自己.如果一个函数调用的是自己本身,那么这个函数就是递归函数. 我们可以看一下普通函数的调用怎么样的.试想如果函数A调用了函数B,函数B又调用了函数C,那么在堆栈中的数据是怎么保存的呢? 函数A ^ 函数B | (地址递减) 函数C |

算法学习之递归和堆栈

[摘要]当执行完被调用函数,返回外部程序前,系统首先要恢复外部程序的变量当前值,然后返回外部程序的返回地址.递归函数被外部程序调用时,系统要做的工作和非递归函数被调用时系统要做的工作在形式上类同,只是实现方法不同而已.那递归代码和运行时的堆栈有什么关系呢?我们先看一下下面这几幅图,关于递归代码和运行时堆栈关系. 我们可以看一下普通函数的调用怎么样的.试想如果函数A调用了函数B,函数B又调用了函数C,那么在堆栈中的数据是怎么保存的呢? [cpp] view plaincopy 函数A    ^ 函

c++(递归和堆栈)

看过我前面博客的朋友都清楚,函数调用主要依靠ebp和esp的堆栈互动来实现的.那么递归呢,最主要的特色就是函数自己调用自己.如果一个函数调用的是自己本身,那么这个函数就是递归函数. 我们可以看一下普通函数的调用怎么样的.试想如果函数A调用了函数B,函数B又调用了函数C,那么在堆栈中的数据是怎么保存的呢? 函数A ^ 函数B | (地址递减) 函数C | 如果是递归函数呢,举一个简单的递归函数为例: int iterate(int value) { if(value == 1) return 1;

数据结构和算法学习三,之递归和堆栈

引自:http://blog.csdn.net/feixiaoxing/article/details/6838773 函数调用主要依靠ebp和esp的堆栈互动来实现的.那么递归呢,最主要的特色就是函数自己调用自己.如果一个函数调用的是自己本身,那么这个函数就是递归函数. 我们可以看一下普通函数的调用怎么样的.试想如果函数A调用了函数B,函数B又调用了函数C,那么在堆栈中的数据是怎么保存的呢? 函数A    ^函数B    |    (地址递减)函数C    | 如果是递归函数呢,举一个简单的递

如何将循环写成递归

转载:http://blog.csdn.net/feixiaoxing/article/details/6838362 其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点,那么递归却没有那么简单.我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕.所谓的递归就是函数自己调用自己而已,循环本质上也是一种递归.  1)求和递归函数 我们可以举一个循环的例子,前面我们说过,如果编写一个1到n的求和函数怎么写呢,你可能会这么写: int cal

一步一步写算法(之循环和递归)

原文:一步一步写算法(之循环和递归) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点,那么递归却没有那么简单.我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕.所谓的递归就是函数自己调用自己而已,循环本质上也是一种递归.  1)求和递归函数 我们可以举一个循环的例子,前面我们说过,如果编写一个1到n的求和函数怎么写呢,你可能会

c++2(循环和递归)

其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点,那么递归却没有那么简单.我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕.所谓的递归就是函数自己调用自己而已,循环本质上也是一种递归.  1)求和递归函数 我们可以举一个循环的例子,前面我们说过,如果编写一个1到n的求和函数怎么写呢,你可能会这么写: int calculate(int m) { int count = 0; if(m <0) return -1; for(int i

数据结构和算法学习二,之循环和递归

引自:http://blog.csdn.net/feixiaoxing/article/details/6838362 其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点,那么递归却没有那么简单.我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕.所谓的递归就是函数自己调用自己而已,循环本质上也是一种递归.  1)求和递归函数 我们可以举一个循环的例子,前面我们说过,如果编写一个1到n的求和函数怎么写呢,你可能会这么写: int cal