首先先介绍一下栈的概念
下面是一个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) 。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。