在函數調用時,為了保證能夠正確返回,必須進行保存現場和恢復現場,也就是被調函數結束后能夠回到主調函數中離開時的位置然后繼續執行主調函數中的代碼。這些現場或上下文信息保存在線程棧中,而線程棧的大小是有限的。
對於函數遞歸調用,會將大量的上下文信息入棧,如果遞歸深度過大,會導致線程棧空間不足而崩潰。
在Python中,為了防止棧崩潰,默認遞歸深度是有限的。
# 這是一個簡單的遞歸函數
def demo(n=0):
try:
demo(n+1)
except:
print(n)
demo()
通過這個簡單的無限遞歸,你會發現並沒有無限下去,而是到了一個限度就沒有遞歸了,這是默認的遞歸是有限度的。
但是你可以通過修改默認遞歸深度來控制他例如:
import sys
# 如果確實需要很深的遞歸深度,可以使用sys模塊中的setrecursionlimit()函數修改默認的最大深度限制。
sys.setrecursionlimit(1000)
# 這是一個簡單的遞歸函數
def demo(n=0):
try:
demo(n+1)
except:
print(n)
demo()
這次的遞歸深度明顯就比上一次的不一樣了。再用一個例子來說明一下:
import sys
from functools import lru_cache
# 如果確實需要很深的遞歸深度,可以使用sys模塊中的setrecursionlimit()函數修改默認的最大深度限制。
sys.setrecursionlimit(3000)
@lru_cache(maxsize=64)
def cni(n, i):
if n == i or i == 0:
return 1
return cni(n - 1, i) + cni(n - 1, i - 1)
print(cni(900, 100))
這也是一個修改默認的最大限制的遞歸了