美文网首页
浅谈递归调用栈

浅谈递归调用栈

作者: hiric | 来源:发表于2018-04-23 15:15 被阅读0次

最近在看《算法图解》这本书,目前也在复习这些基础的算法知识,正好也可以在这里做一些总结,以加深自己的体会与理解。

说到递归,对于一个接触过计算机科学领域的人来说再熟悉不过了,从字面的意思很容易理解,但是有很多人(比如我。。。)

看似能够理解递归的思路,实则一头雾水,以至于在解题的过程中会有很多的疑问和错误。下面就来分析一下递归的工作机制。

调用栈

计算机在内部使用调用栈的栈,我们来看看是如何使用调用栈的。下面是一个函数


def great(name):

    print("hello, "+name+"!")

    great2(name)

    print("getting ready to say bye...")

    bye()

而另外两个函数:


def greet2(name):

  print("how are you, "+name+"?")

def bye():

  print("ok bye!")

开始执行时,比如调用greet("maggie"),计算机首先为该函数调用分配一块内存,将变量name设为maggie

image

接下来, 你打印hello, maggie!,再调用greet2("maggie")。同样,计算机也为这个函数调用分配一 块内存。

image

计算机使用一个栈来表示这些内存块,其中第二个内存块位于第一个内存块上面。你打印 how are you, maggie?,然后从函数调用返回。此时,栈顶的内存块被弹出。

image

现在,栈顶的内存块是函数greet的,这意味着你返回到了函数greet。当你调用函数greet2 时,函数greet只执行了一部分。这是本节的一个重要概念:调用另一个函数时,当前函数暂停 并处于未完成状态。该函数的所有变量的值都还在内存中。执行完函数greet2后,你回到函数 greet,并从离开的地方开始接着往下执行:首先打印getting ready to say bye…,再调用 函数bye。

image

在栈顶添加了函数bye的内存块。然后,你打印ok bye!,并从这个函数返回

image

相关文章

  • 浅谈递归调用栈

    最近在看《算法图解》这本书,目前也在复习这些基础的算法知识,正好也可以在这里做一些总结,以加深自己的体会与理解。 ...

  • 递归(recursion)

    基线条件(base case)&递归条件(recursive case) 递归条件基线条件 堆栈 调用栈 递归调用栈

  • 第三章:递归

    递归 盒子里面找钥匙 基线条件和递归条件 栈 调用栈 调用另一个函数时,当前函数暂停并处于未完成的状态 递归调用栈...

  • 算法图解系列之递归[03]

    3 递归 3.1 递归<函数> 3.2 基线条件和递归条件 3.3 递归调用栈

  • 算法图解 (三)

    递归 基线条件指的是函数不再调用自己, 相当于一个出口; 递归条件指的是函数自己调用自己 栈 栈又称为栈或堆叠, ...

  • 记录不使用递归的斐波那契数列

    用普通的递归法会爆栈的原因是栈内存一般比较小, 而使用递归通常会向调用栈内加入大量的待调用函数, 超过调用栈的大小...

  • 递归&尾递归

    调用栈的特点,先进后出, FILO, 场景还原。 递归 有栈溢出的可能 stack overflow 尾递归 编译...

  • c c++ java堆栈空间内存

    1.C中栈空间是十分有限的。 测试环境VS2015Window10函数的递归调用要依赖栈空间,这也导致递归调用次数...

  • NO.44 递归

    递归:方法自己调用自己 递归的弊端:不能调用次数过多,容易导致栈内存溢出 递归的好处:不用知道循环的次数 构造方法...

  • 尾递归优化

    “尾递归优化”的含义是:如果递归函数属于尾递归,那么运行时会优化其调用过程。优化主要针对调用栈,将多层调用,转化为...

网友评论

      本文标题:浅谈递归调用栈

      本文链接:https://www.haomeiwen.com/subject/xqlllftx.html