青蛙跳台階問題在面試中經常會被問到,如果你之前沒聽過這個演算法問題,那麼在面試短時間內能給出完整的答案還是有一定的難度的,但是其實也並不算很難,看完這篇文章,相信你會恍然大悟的。
乙隻青蛙一次可以跳一級台階,也可以一次跳兩級台階,現在有 n 級台階,問青蛙一共有多少種跳法?
咋一看到這種問題,好像沒有什麼思路,不知道從**著手分析,那麼我們就從最簡單的情況開始分析,假如 n = 1,即一共只有一級台階,顯然一共就只有一種跳法,假如 n = 2,一共有兩級台階,那麼可以每次跳一級跳兩次,或者也可以一次跳兩級,也就是說一共有兩種跳法。n 越大跳法就越多,但是我們可以發現乙個規律,就是把 n 拆分成各個比他小的數來分析,這裡有點像分而治之的思想,即把大問題劃分為若干個小問題來處理,最後再把小問題彙總去解決大問題。
我們先令 f(n) 為 n 級台階的總跳法數,那麼第一次如果選擇跳一級的話,那麼剩下的 n-1 級台階的跳法數就為 f(n-1),如果第一次跳兩級的話,那麼剩下的 n-2 級台階的跳法就是 f(n-2),然後再回到題目中要求來看,青蛙一次只能挑一級或兩級,也就是說剛剛列舉的這兩種情況的和就是青蛙一共有多少種跳法,所以 f(n) = f(n-1) + f(n-2)。到了這一步,我們不難看出,這其實就是數學中的斐波拉契數列,看到這裡應該會有恍然大悟的感覺了,如果還沒明白的話,請回到文章開頭再次認真看。
問題的思路已經找到了,接下來我們就用 python 來實現這個斐波拉契數列吧。關於斐波拉契數列的實現,我這裡用了兩種方式,一種是遞迴,一種是迴圈,其中一旦 n 資料較大時遞迴的效率是非常非常差的,大家可以用 n = 100 簡單試一下就知道有多慢了,估計沒個 10 分鐘計算機是算不出來的,其時間複雜度為 o(2^n),隨 n 的增加時間複雜度成指數級增長,因為在這遞迴過程中,我們在不斷重複計算 f(n-1) 和 f(n-2) 的值,即每計算數列中的某個數,都會從 1 重新開始計算,這樣的效率能不慢麼,所以遞迴這種方式不可取。用乙個簡單的迴圈效率一下子就上來了,時間複雜度為 o(n)。
# 斐波拉契數列實現方法一:遞迴
def fibonacci(n):
if n > 2:
return fibonacci(n-1) + fibonacci(n-2)
else:
return n
print(fibonacci(10))
# 斐波拉契數列實現方法二:for迴圈
def fibonaccifor(n):
for i in range(3,n+1):
n = (i-1) + (i-2)
return n
print(fibonaccifor(4))
最後大家還可以繼續思考下,如果題目條件改為一次可以跳一級,也可以一次跳 n 級,那麼總共的跳法又是多少呢?這裡直接給出答案吧,f(n) = 2^(n-1),這個結果是數學公式換算推導出來的,大家可以嘗試去驗證下。 演算法 青蛙跳台階
1.乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。典型的斐波那契數列 2.青蛙跳台階plus版本 乙隻青蛙一次可以跳上1級台階,也可以跳上2級 它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。關於本題,前提是n個台階會有一次n階的跳法。分析如...
青蛙跳台階
乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。解題思路 1 如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n 1個台階,跳法是f n 1 2 假定第一次跳的是2階,那麼剩下的是n 2個台階,跳法是f n 2 3 總跳法為 f n f n...
青蛙跳台階
之前面試遇到了這種題目,不會,後來搜尋了一下,感覺分析的很好 青蛙跳乙個n階的台階,每次可以跳1階或者2階,求跳完n階y有多少種方法。分析 n 1,f n 1 n 2,f n 2 n 3,f n 3 n 4,f n 5 可以發現 f n f n 1 f n 2 由此也可以推想 比如要跳到第4階樓梯上...