青蛙跳臺階-遞歸思想解算

問題:一只青蛙一次可以跳上一級臺階远剩,也可以跳上兩級臺階扣溺。求該青蛙跳上n級臺階總共有多少種跳法?

思路:要跳上 第n級 臺階瓜晤,要么從第 n-1 級臺階跳上锥余,要么從第 n-2 級臺階跳上,只有這兩種方法痢掠。因此驱犹,跳上 第n級 臺階的跳法等于跳上 第n-1級 的跳法 加上 跳上第n-2級的跳法。采用遞歸算法實現(xiàn)雄驹。

基線條件:if n == 0 or n == 1 or n == 2: return n

遞歸公式:f(n) = f(n-1) + f(n-2)

代碼:

def stairs(n):

    # 基線條件 => 跳出遞歸調(diào)用
    if n == 0 or n == 1 or n == 2:
        return n
    
    # 遞歸公式:實現(xiàn)遞歸調(diào)用
    return stairs(n-1) + stairs(n - 2)


print(stairs(5))

>>>
8

2020年11月30日修改:
使用遞歸求解,當(dāng)臺階數(shù)n過大時(>50)锌云,就會比較耗時了吁脱;
因此需要更改方式桑涎,觀察規(guī)律可知:f(n) = f(n-1) + f(n-2),屬于斐波那契數(shù)列攻冷。
故代碼如下:

def stairs(n):
    n1 = 1  # 一級臺階跳法數(shù)
    n2 = 2  # 二級臺階跳法數(shù)
    
    # 一級、二級臺階直接返回遍希,三級臺階以上循環(huán)計算n級臺階前兩級跳法和
    # 例如:n = 3,n3 = n1 + n2,由于只使用兩個位置存儲數(shù)值禁谦,則需要更新n1, n2
    # n2 = n1 + n2, n1 = n2。以繼續(xù)計算n>3的情況州泊。(最后n2即為結(jié)果)
    if n == 1:
        return n1
    elif n == 2:
        return n2
    else:
        for i in range(3, n + 1):
            n1, n2 = n2, n1 + n2
        return n2

補(bǔ)充:

1)遞歸函數(shù)優(yōu)點(diǎn) => 定義簡單丧蘸,邏輯清晰遥皂;

缺點(diǎn):使用遞歸函數(shù)需要注意防止棧溢出。

遞歸調(diào)用時使用棧來保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場演训,也很耗費(fèi)資源弟孟。

2)計算機(jī)中,函數(shù)調(diào)用是通過棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的样悟,每當(dāng)進(jìn)入一個函數(shù)調(diào)用拂募,棧就會加一層棧幀,每當(dāng)函數(shù)返回乌奇,棧就會減一層棧幀没讲。由于棧的大小不是無限的,所以礁苗,遞歸調(diào)用的次數(shù)過多爬凑,會導(dǎo)致棧溢出。(RuntimeError: maximum recursion depth exceeded in comparison = > 運(yùn)行錯誤:超出最大遞歸深度试伙。)

python默認(rèn)棧的層數(shù)為1000層

3)使用尾遞歸進(jìn)行優(yōu)化:在遞歸函數(shù)返回的遞歸公式中直接調(diào)用自身本身嘁信,而不是返回計算表達(dá)式。這樣疏叨,編譯器或者解釋器就可以把尾遞歸做優(yōu)化潘靖,使遞歸本身無論調(diào)用多少次,都只占用一個棧幀蚤蔓,不會出現(xiàn)棧溢出的情況卦溢。

需要每次調(diào)用時都直接計算結(jié)果,并將每次調(diào)用的前結(jié)果暫存起來秀又。

4)遺憾的是单寂,大多數(shù)編程語言沒有針對尾遞歸做優(yōu)化,Python解釋器也沒有做優(yōu)化吐辙,所以宣决,即使把遞歸函數(shù)改成尾遞歸方式,也會導(dǎo)致棧溢出昏苏。

尾遞歸:

# 尾遞歸計算num的階乘
def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num - 1, num * product)

return fact_iter(num - 1, num * product)僅返回遞歸函數(shù)本身尊沸,num - 1num * product在函數(shù)調(diào)用前就會被計算威沫,不影響函數(shù)調(diào)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洼专,一起剝皮案震驚了整個濱河市棒掠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屁商,老刑警劉巖句柠,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異棒假,居然都是意外死亡溯职,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門帽哑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谜酒,“玉大人,你說我怎么就攤上這事妻枕∑ё澹” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵屡谐,是天一觀的道長述么。 經(jīng)常有香客問我,道長愕掏,這世上最難降的妖魔是什么度秘? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮饵撑,結(jié)果婚禮上剑梳,老公的妹妹穿的比我還像新娘。我一直安慰自己滑潘,他們只是感情好垢乙,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布追逮。 她就那樣靜靜地躺著,像睡著了一般钮孵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上油猫,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天柠偶,我揣著相機(jī)與錄音情妖,去河邊找鬼诱担。 笑死,一個胖子當(dāng)著我的面吹牛蔫仙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摇邦,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼居扒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丑慎,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤竿裂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腻异,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悔常,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸥昏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡吏垮,死狀恐怖罐旗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情九秀,我是刑警寧澤遗嗽,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布痹换,位于F島的核電站征字,受9級特大地震影響匙姜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冯痢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望袖肥。 院中可真熱鬧,春花似錦昭伸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夹供。三九已至,卻和暖如春哮洽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸟辅。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匪凉,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓贸铜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親聂受。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361