python遞歸二

上一節(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é)出遞歸的特點:

  1. 正確的遞歸必須有一個結(jié)束條件
  2. 每一次遞歸的調(diào)用必須離結(jié)束條件越來越近
  3. 遞歸效率不高,遞歸層次過多會導致棧溢出
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 你是女生,漂亮的女生 你是女生,愛哭的女生 你是女生,可愛的女生… 雖有些小胖卻不失可愛,有神的眼睛,長長的睫毛,...
    桉晨閱讀 269評論 0 0
  • 為了想一個設(shè)計方案,我開始瀏覽多個知名設(shè)計網(wǎng)站尋找靈感,但發(fā)現(xiàn)再好的東西也只是呈現(xiàn)它自己的精美。 接著我打開了簡書...
    藍月岫風閱讀 354評論 0 0
  • 午后的陽光透過樹葉的縫隙撒下,像密密麻麻的金色雨點!獨自走在母校的林蔭小道,思緒一下子飛回那個青春懵懂的歲...
    燕暖心閱讀 180評論 0 0
  • 我的祖父兄弟三人,他排行老大。如今健在的是我祖父的二弟,也就是我的二爺。由于早年復雜的時代背景和家庭狀況,二爺無奈...
  • 櫻花雨 粉紅的櫻花開滿山道 你是否, 還記得它青色的模樣? 你騎著馬,嗒嗒行過 點點飛花,滑落馬蹄 為你絢爛一個春...
    水鐸閱讀 297評論 0 1

友情鏈接更多精彩內(nèi)容