題目描述
一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先后次序不同算不同的結(jié)果)。
這題其實有點像fib數(shù)列,用遞歸寫的
遞歸寫法
def jumpFloor(number):
if number <= 0:
return 0
if number in [1,2]:
return number
return jumpFloor(number - 2) + jumpFloor(number - 1)
很可惜 雖然想了出來但是并沒有通過。
運(yùn)行超時:您的程序未能在規(guī)定時間內(nèi)運(yùn)行結(jié)束,請檢查是否循環(huán)有錯或算法復(fù)雜度過大
日
好吧,用遞歸寫的那一刻我就該意識到這一點
尾遞歸寫法
def jumpFloor(number, curr = 2, last = 1):
if number == 0:
return 0
if number == 1:
return 1
if number == 2: #這里是if,如果是else也會出錯
return curr #這里是返回curr,返回2會出錯
return jumpFloor(number - 1, curr + last, curr)
尾遞歸我吃了好多坑,倒數(shù)第二行返回2我簡直是腦抽,因為number最終肯定會變成2,那么不管怎么樣輸出的結(jié)果都是2;
在這個代碼里,最后的出口并不是最下面的
return jumpFloor(number - 1, curr + last, curr)
而是代碼上面那個判斷條件
if number == 2: #這里是if,如果是else也會出錯
return curr #這里是返回curr,返回2會出錯
所return的是curr,而并不是靠上級領(lǐng)導(dǎo)等下屬都忙完了再來添上一筆,這點和遞歸很不一樣。
關(guān)于第三個if可以為curr,那么第二個if是否可以也改成last呢,其實無影響,因為number根本就不可能到為1的時候。
關(guān)于倒數(shù)第3行為什么不能改else,這里有個例子
def f(n):
if n == 0:
print(0)
if n == 1:
print(1)
else:
print(2)
if __name__ == '__main__':
f(0)
輸出結(jié)果為
0
2
這里看下來,會一順溜的打印下來,結(jié)果就不唯一了
還有個情況
def f(n):
if n == 1:
return 1
else:
return 2
if n == 0: #這句他媽逼甚至都不會被管
return 0
if __name__ == '__main__':
print(f(0))
在Pycharm里,寫標(biāo)示的下面都是亮黃燈,else下面的if語句甚至不會再執(zhí)行。
總結(jié):有多個if的情況下就不要再用else
雖然編譯通過了 但是還是想試試其他寫法
動態(tài)規(guī)劃
pass
學(xué)到我再補(bǔ)8