首先先介绍一下栈的概念

下面是一个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?,然后从函数调用返回。此时,栈顶的内存块被弹出。

 

现在, 栈顶的内存块是函数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) 。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐