1. 程式人生 > >N級臺階(比如100級),每次可走1步或者2步,求總共有多少種走法?

N級臺階(比如100級),每次可走1步或者2步,求總共有多少種走法?

走臺階演算法(本質上是斐波那契數列)在面試中常會遇到,描述就如題目那樣:總共100級臺階(任意級都行),小明每次可選擇走1步、2步或者3步,問走完這100級臺階總共有多少種走法?


一、 題目分析

這個問題本質上是斐波那契數列,假設只有一個臺階,那麼只有一種跳法,那就是一次跳一級,f(1)=1;如果有兩個臺階,那麼有兩種跳法,第一種跳法是一次跳一級,第二種跳法是一次跳兩級,f(2)=2。如果有大於2級的n級臺階,那麼假如第一次跳一級臺階,剩下還有n-1級臺階,有f(n-1)種跳法,假如第一次條2級臺階,剩下n-2級臺階,有f(n-2)種跳法。這就表示f(n)=f(n-1)+f(n-2)。將上面的斐波那契數列程式碼稍微改一下就是本題的答案。我們來看一下程式碼的實現。


二、斐波那契數列法

public class Test {
    static final int s = 100; //自定義的臺階數

    static int compute(int stair){
        if ( stair <= 0){
            return 0;
        }
        if (stair == 1){
            return 1;
        }
        if (stair == 2){
            return 2;
        }
        return compute(stair-1
) + compute(stair-2); } public static void main(String args[]) { System.out.println("共有" + compute(s) + "種走法"); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20


三、 走臺階問題的簡單解決演算法

但我自己對於這個題目最早的想法是使用樹(多叉樹)的方式,100為根節點,每次選擇的分支有兩種(1、2),然後生成深度為1的樹,再從每個2級節點延伸出1、2兩個分支,直到所有節點的值<=0,最後統計出所有值為0的葉子節點的數目,就是結果。

不過自己想法實際上把問題複雜化了,下面這種使用遞迴方式實現的演算法本質上和我的思想差不多,但是很明顯下面這個演算法會簡單很多。接下來我們來看看這個演算法的實現方式。

public class Test {
    static final int s = 100;  //自定義的臺階數
    static int len = 0, sum = 0;

    //最多也只有走100步就到了
    static int step[] = new int[s];

    static void compute(final int stair) {
        if (stair < 0)
            return;

        //表示已經走完了
        if (stair == 0) {
            printSum();
            sum++;
            return;
        }

        //每次到下一步選擇時都可以走1-2步
        for (int i = 1; i <= 2; i++) {
            step[len] = i;
            len++;

            //進行下一步的迭代,迭代完之後將每後加上的一步去掉,換成其它的步數(如從1換成2)
            compute(stair - i);
            len--;
        }
    }

    static void printSum() {
        System.out.print("走法:");
        for (int i = 0; i < len; i++)
            System.out.print(step[i] + " ");
        System.out.println();
    }

    public static void main(String args[]) {
        compute(s);
        System.out.println("共有" + sum + "種走法");
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42