浅谈递归调用栈

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

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

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

调用栈

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


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

浅谈递归调用栈_第1张图片
image

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

浅谈递归调用栈_第2张图片
image

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

浅谈递归调用栈_第3张图片
image

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

浅谈递归调用栈_第4张图片
image

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

浅谈递归调用栈_第5张图片
image

你可能感兴趣的:(浅谈递归调用栈)