Python递归调用栈

Python递归调用栈,第1张

首先先介绍一下栈的概念

下面是一个demo:

def greet(name):
    print("hello, " + name + "!")
    greet2(name)
    print("getting ready to say bye...")
    bye()

def greet2(name):
    print("how are you, " + name + "?")

def bye():
    print("ok bye!")

greet("maggie") #调用greet("maggie")时,计算机将首先为该函数调用分配一段内存

假设你调用greet("maggie"),计算机将首先为该函数调用分配一块内存。

我们来使用这些内存。变量name被设置为maggie,这需要存储到内存中。

每当你调用函数时,计算机都像这样将函数调用涉及的所有变量的值存储到内存中。接下来,
你打印hello, maggie!,再调用greet2("maggie")。同样,计算机也为这个函数调用分配一
块内存。

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

 

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

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

现在你又回到了函数greet。由于没有别的事情要做,你就从函数greet返回。这个栈用于
存储多个函数的变量,被称为调用栈.

递归函数用到了栈的概念

def fact(x):
    if x==1:
        return 1
    else:
        return x*fact(x-1)
fact(3)

所谓递归就是“我调用我自己”,每个递归函数都有两部分:基线条件( base case)和递归条件( recursive case) 。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/738317.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存