因爲棧的大小不是無限的,因此遞歸調用的次數過多便會致使棧的溢出,一般解決棧溢出的方法python
是尾遞歸優化,尾遞歸跟循環的效果同樣,它在函數返回時調用函數自己,並在return語句不能包函數
含表達式。編譯器和解釋器就能夠對尾遞歸進行優化,遞歸自己不管調用多少次都只佔用一個棧幀優化
,從而避免棧的溢出。遞歸
代碼實現:編譯器
#!usr/bin/python3it
# -*- coding:UTF-8 -*-編譯
def fact(m):coding
return fact_item(n, 1)循環
def fact_item(num, p):方法
if num == 1:
return p
return fact_item(num - 1, num * p)
print(fact(5))
代碼的調用過程:
=====> fact_item(5, 1)
=====> fact_item(4, 5)
=====> fact_item(3, 20)
=====> fact_item(2, 60)
=====> fact_item(1, 120)
>>> 120
從結果就能夠看到,調用尾遞歸的時候若是作出優化後,棧就不會增加,因此無論調用多少次都不會
致使棧溢出。