上一節(jié)我們簡單得接觸了遞歸得概念,這次我們再次探討一下遞歸。
遞歸在實現(xiàn)的過程中,會被限制最多層次,本質(zhì)原因是什么呢。
原因就是python專門設(shè)置的一種機制用來防止無限遞歸造成Python溢出崩潰,默認的遞歸深度大約是900多,但是我們可以通過手工設(shè)置遞歸深度來解決這個問題。
import sys
sys.setrecursionlimit(10000) #例如這里設(shè)置為一萬
話說回來就是,每次調(diào)用一次函數(shù),棧就會增加一層棧幀,每當函數(shù)返回,棧就會減小一層棧幀,由于棧的大小不是無限的,所以遞歸調(diào)用的次數(shù)過多,就會導致棧溢出。
下面我們用研究一下遞歸的實現(xiàn)原理。
舉個例子:
def calc(n):
v = int(n/2)
if v == 0:
return
print(v)
calc(v)
我們看一下運行結(jié)果
>>>calc(10)
5
2
1
很容易理解這個結(jié)果是怎么出來的,下面我們在探討一個問題
def calc(n):
v = int(n/2)
if v == 0:
return
print(v)
calc(v)
print(v)
那么這次調(diào)用的結(jié)果是什么呢?
>>>calc(10)
5
2
1
1
2
5
為什么是這樣的輸出結(jié)果呢, 5 2 1的輸出我們是很容易理解的,為什么在calc(v)之后再次print(v)會反著輸出一遍呢,我們思考一下。

我們之前說過,遞歸的調(diào)用每一層結(jié)束以后不會退出,而是堆到棧里面去,所以,在這個函數(shù)中,第一次調(diào)用:v1=5;第二次調(diào)用:v2=2;第三次調(diào)用:v3=1;第四次調(diào)用:v4=0 遞歸調(diào)用停止,第四層結(jié)束,此時程序回到了第三層調(diào)用第四層的地方,所以會print(v3),然后第三層結(jié)束,以此類推...
由此我們可以總結(jié)出遞歸的特點:
- 正確的遞歸必須有一個結(jié)束條件
- 每一次遞歸的調(diào)用必須離結(jié)束條件越來越近
- 遞歸效率不高,遞歸層次過多會導致棧溢出