1. 程式人生 > >青蛙跳臺階問題

青蛙跳臺階問題

題目一:一隻青蛙一次可以跳上一級臺階,也可以跳上兩級臺階。求該青蛙跳上一個n級臺階總共有多少種跳法

分析:

當n=1時,只有一種跳法;

當n=2時,可以一次跳一級,也可以一次跳2級,有兩種跳法

當n>2時,第一次跳的時候有兩種選法,只跳一級,此時跳法數目等於後面剩下的n-1級臺階的跳法數目,即為f(n-1)

                 第一次跳2級,此時跳法的數目等於後面剩下的n-2級臺階的跳法數目,即為f(n-2)

總數f(n)=f(n-1)+f(n-2),實際上就是斐波那契數列的解法

非遞迴解法:

int jumpFloor(int number) {
        int ret[3]={0,1,2};
        if(number<=2)
        {
            return ret[number];
        }
        int first=2;
        int second=1;
        int sum=0;
        for(int i=3;i<=number;i++)
        {
            sum=first+second;
            first=second;
            second=sum;
        }
        return sum;
    }

題目二:一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。

分析:

當n=1時,有一種跳法

當n=2時,有2種跳法

當n>2時,第一次跳1級臺階後,後面還有f(n-1)種跳法,第一次跳2級臺階後,後面還有f(n-2)種跳法......,第一次跳n級後,後面還有f(n-n)種跳法

總的跳法:f(n)=f(n-1)+f(n-2)+...f(n-n)=f(0)+f(1)+f(2)+...f(n)

                  f(n-1)=(0)+f(1)+....f(n-2)

得出f(n)=2*f(n-1)(n=2)

非遞迴解法:

int jumpFloorII(int number) {
        int ret[3]={0,1,2};
        if(number<=2)
        {
            return ret[number];
        }
        
        int mid=2;
        int sum=0;
        for(int i=3;i<=number;i++)
        {
            sum=2*mid;
            second=sum;
        }
        return sum;
    }