356,青蛙跳台階相關問題

2021-10-05 19:08:36 字數 2455 閱讀 7722

我們來分析一下:

當n等於1的時候,只需要跳一次即可,只有一種跳法,記f(1)=1

當n等於2的時候,可以先跳一級再跳一級,或者直接跳二級,共有2種跳法,記f(2)=2

當n等於3的時候,他可以從一級台階上跳兩步上來,也可以從二級台階上跳一步上來,所以總共有f(3)=f(2)+f(1);

同理當等於n的時候,總共有f(n)=f(n-1)+f(n-2)(這裡n>2)種跳法。

所以大家一看就知道這就是個斐波那契數列,只不過有一點不同的是斐波那契數列一般是以1,1,2,3,5,8,13……開始的,而我們這是以1,2,3,5,8,13……開始的,少了最前面的乙個1。最**很簡單

public

static

intf

(int n)

我們以計算f(6)為例畫個圖看一下計算的過程

我們看到遞迴會重複計算已經計算過的值,效率明顯不是很高,我們還可以把計算過的值儲存起來,防止重複計算,我們來看下**

private

static

intf2

(int n, hashmap

map)

我們還可以把遞迴改為非遞迴的形式,看下**

private

static

intf3

(int n)

return sum;

}

上面3種方式都可以實現青蛙跳台階問題,那麼哪種效率更高呢,我們來找個比較大的資料測試一下

public

static

void

main

(string[

] args)

來看一下執行的時間

1836311903

1836311903

1836311903

我們看到遞迴優化之前執行時間是非常長的,優化之後時間大幅下降,但對於非遞迴來說又稍遜色了一些。

我們來分析一下

乙隻青蛙要想跳到n級台階,可以從一級,二級……,也就是說可以從任何一級跳到n級,

所以遞推公式我們很容易就能想到

f(n)=f(n-1)+f(n-2)+……+f(2)+f(1)+f(0);最後這個f(0)是可以去掉的,因為0級就相當於沒跳,所以f(0)=0;

然後我們把f(0)去掉在轉換一下:

f(n-1)=f(n-2)+f(n-3)+……+f(2)+f(1);

所以f(n)=f(n-1)+f(n-1)=2*f(n-1);他是乙個等比數列,且f(1)=1;

我們我們可以得出f(n)=2^(n-1);**如下

private

static

intf4

(int n)

或者還可以改為非遞迴的

private

static

intf5

(int n)

這道題我們要分開討論:

1,如果n<=m;因為只能往上跳不能往下跳,所以大於n的都不可以跳,如果跳了就直接超過了,只能跳小於等於n的數字,那麼這個問題就直接退到問題2了。

2,如果n>m;我們要想跳到n級台階,我們可以從n-1級跳一步上來,或者從n-2級跳兩步上來……,或者從n-m級跳m步上來,所以我們可以找出遞迴公式

f(n) = f(n-1) + f(n-2) + f(n-3) + … + f(n-m);

進一步可以推出:

f(n-1) = f(n-2) + f(n-3) + … + f(n-m) + f(n-m-1);

化簡結果為:

f(n) = 2f(n-1) - f(n-m-1);(n>m)

所以**我們要分為兩部分,一部分是n>m,另一部分是n<=m,我們來看下**

public

static

intf6

(int n,

int m)

斐波那契數列又稱**分割數列,他有很多的特性,比如兔子的繁殖,他的通項公式如下

青蛙跳台階問題

題目 乙隻青蛙一次可以跳上 1 級台階,也可以跳上2 級。求該青蛙跳上乙個n 級的台階總共有多少種跳法。我的思路 最開始我的思路是把這個看成是乙個數學問題,n i 1 k 2先把所有可能滿足這個公式的i和k求出來。然後在對i和k做排列組合。很明顯i的範圍應該是0 public int jumpflo...

青蛙跳台階問題

1 乙隻青蛙一次可以跳上 1 級台階,也可以跳上2 級。求該青蛙跳上乙個n 級的台階總共有多少種跳法。2 乙隻青蛙一次可以跳上1級台階,也可以跳上2 級 它也可以跳上n 級,此時該青蛙跳上乙個n級的台階總共有多少種跳法?分析 1 當n 1,只有1中跳法 當n 2時,有兩種跳法 當n 3 時,有3種跳...

青蛙跳台階問題

問題一 有乙隻青蛙,需要跳上100級台階。青蛙每次可以調一級或者兩級台階。問青蛙有多少種方式可以跳100級台階。思路 逆推 當青蛙站在100級台階上時,那它跳上100級時有可能是從99級跳一級上來的,也可能是從98級跳兩級跳上來的 從98級跳兩個一級包括在從99級跳一級情況內,所以不予考慮 所以f ...