跳臺階問題

在看這個問題之前,我們先來看看斐波那契數列

斐波那契數列f(0)=0,f(1)=1,f(2)=f(1)+f(0),f(n)=f(n-1)+f(n-2)
求他n項的程序如下

public int Fibonacci(int n) {
        if(n==0){
            return 0;
        }
        if(n==1){
            return 1;
        }
        return recursion(n);
    }
    public int recursion(int n){
        if(n==2 || n==1){
            return 1;
        }
        int a=recursion(n-1);
        int b=recursion(n-2);
        return a+b;
    }

很容易的一個遞歸實現

接下來我們來看看青蛙跳臺階的問題,一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

這個題的思路是找到第n項個前面項之間的關係,結論是f(n)=f(n-1)+f(n-2),這個式子是怎麼來的呢?首先我們看(n-1)階,他有一種方法到n階臺階,再來看(n-2)階,他有兩種方法到n階臺階,因爲一步一步跳這種情況已經包含在了(n-1)階跳一步到n階,所以也只有一種,因爲青蛙只能跳一步或者兩步,因此(n-1)階和(n-2)階的跳法之和就等於n階的跳法數。f(1)=1,f(2)=2,f(3)=3,f(n)=f(n-1)+f(n-2)和斐波那契數列類似,下面是程序實現

public int JumpFloor(int target) {
        if(target==0)
            return 0;
        if(target==1)
            return 1;
        if(target==2)
            return 2;
        return recursion(target);
    }

     public int recursion(int n){
        if(n==2)
            return 2;
        if(n==1)
            return 1;
        int a=recursion(n-1);
        int b=recursion(n-2);
        return a+b;
    }

接下來我們看看青蛙能跳1,2,3…….n階的情況,類似於之前的分析,f(n)=f(n-1)+f(n-2)+f(n-3)+…..+f(1)+1,f(1)=1
看起來這個式子很複雜,其實經過化簡f(n)=2^n ,f(0)=0,f(1)=1,下面是程序實現

public int JumpFloorII(int target) {
        if(target==0)
            return 0;
        return 1<<(target-1);
    }

還有一個問題,也是這個類型的問題,我們可以用2*1的小矩形橫着或者豎着去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?解法和第一種跳臺階問題一樣,下面是代碼

 public int RectCover(int target) {
        if(target==0)
            return 0;
        if(target==1)
            return 1;
        if(target==2)
            return 2;
        return recursion(target);
    }
    public int recursion(int n){
        if(n==2)
            return 2;
        if(n==1)
            return 1;
        int a=recursion(n-1);
        int b=recursion(n-2);
        return a+b;
    }
發佈了41 篇原創文章 · 獲贊 32 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章