=============================

  • 每当调用函数时,计算机会将函数调用设计的所有变量存贮到内存中。
  • 在函数内调用函数时,内部的函数在调用完成后会返回到上一次函数并且会被踢出栈堆。未完成的函数不会被踢出栈堆。
  • 创建递归函数时刻要记得基线条件和递归条件

一段关于栈的代码解读

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

代码解读:(以x=3为例)

  1. 当x=3,程序进入了else条件并且执行递归,随后创建了x=2的内存块被将其放入栈堆中。
  2. 执行x=2的函数,因为此时x不等于1所以还是进入了else条件执行递归,随后创建了x=1的内存块并将其放入栈堆中。
  3. 此时x=1则进入第一个条件返回1,该轮函数执行完毕被踢出栈堆,同时上一层函数也因为该函数的结束而结束,被踢出栈堆,后面以此类推。
  4. 在此函数中,x==1为基线条件,它决定了什么时候跳出递归循环。而else为递归条件,它决定了递归中执行操作来慢慢接近基线条件。

小结

  • 递归有两种操作,压入和弹出
  • 每个递归函数都有两个条件:基线条件和递归条件
  • 所有的函数调用都将进入调用栈