如果一個(gè)函數(shù)直接或者間接調(diào)用了自己,那么就形成了遞歸(recursion),比如斐波那契數(shù)列的一個(gè)實(shí)現(xiàn)

def fib(n):    if n <= 2:        return 1    else:        return fib(n - 1) + fib(n - 2)

  遞歸一定要有結(jié)束條件,否則就形成了死循環(huán), 比如下面的例子:

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

def a():
    b()def b():
    a() 
if __name__ == '__main__':
    a()

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

  很快 就會(huì)拋出一個(gè)異常:RuntimeError: maximum recursion depth exceeded

  會(huì)什么報(bào)這個(gè)異常,很簡(jiǎn)單,我們都知道子程序調(diào)用(call)需要壓棧出棧,如果無限遞歸調(diào)用,那么就一直壓棧,沒有出棧,內(nèi)存消耗也越來愈多。python比較高級(jí),直接拋出這個(gè)異常,結(jié)束程序運(yùn)行。

 

  前面的文章提到協(xié)程(coroutine)這個(gè)概念,不管是generator還是greenlet,語法看起來都很像函數(shù)調(diào)用,但事實(shí)上并不是,協(xié)程只是在切換的時(shí)候把當(dāng)前調(diào)用棧中的信息存儲(chǔ)了起來:

“all local state is retained, including the current bindings of local variables, the instruction pointer, and the internal evaluation stack. When the execution is resumed by calling one of the generator’s methods, the function can proceed exactly a