青蛙跳臺階&&變態跳臺階

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

解題思路:1.首先可以把它當成一個找規律的問題,然後總結出規律的方程式就可以了。因爲題目限制只有兩種跳法,所以這裏規律就比較好總結
1階:1種
2階:2種
3階:3種
4階:5種
5階:8種
………………….
f(n)=f(n-1)+f(n-2),
這個規律怎麼得出來的呢?舉個例子,假如有5個臺階,我們從第4階1步跳上5,所以有多少方法跳到4就有多少方法跳到5,我們還可以從第3階一次跳2步跳上5,所以跳上3階的有多少種方法,則跳上5就有多少方法(因爲只允許一次跳一步或一次跳兩步)!所以得出上面的規律。有點類似斐波那契數列,但是與其不同的是這裏直接就是1 2 3 5 8,而斐波那契是1 1 2 3 5 8,,這裏注意區分,既然得出了規律了那麼代碼還不好寫嘛!下面給算法出代碼

代碼1(遞歸):

int jumpFloor(int number)//普通跳臺階遞歸版本
        {
            if (number<=0)
                return 0;
            else if (1 == number)
                return 1;
            else if (2 == number)
                return 2;
            else
                return jumpFloor(number - 1) + jumpFloor(number - 2);
        }

代碼2(非遞歸)

    int jumpFloor(int number)//普通跳臺階非遞歸版本
{
    int a = 1;
    int b = 1;
    int c = 0;
    if (1 == number)
      return 1;
    if (number >= 2)
    {
        for (int i = 2; i <= number; i++)
      {
       c = a + b;
       a = b;
       b = c;
      }
       return c;
    }
    return 0;
}

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

解題思路:這個和上面比的話,規律就不是很好找了,不過也不難找。
1階:1種
2階:2種
3階:4種
4階:8種
5階:16種
………………..
f(n)=2*f(n-1),其實也可以說是2^(n-1)只不過這裏n>=1,這個規律怎麼得出來的呢?假如有五階,則第一次跳1階的話剩下4階的那些跳法f(n-1),第一次跳2階的話剩下3階的那些跳法f(n-2),第一次跳3階的話剩下2階的那些跳法f(n-3),第一次跳4階的話剩下的1階的跳法f(n-4),第一次跳5階的話剩下f(n-n)就沒有跳法了。所以可以得出
f(n)=f(n-1)+f(n-2)+f(n-3)+……+f(n-n)
所以化簡可以得
f(n)=2*f(n-1)這裏化簡是數學方法!自己想!
下面給出代碼

代碼1(遞歸)

int JumpFlool(int number)//變態青蛙跳臺階
    {
        if (1 == number)
            return 1;
        if (number >= 2)
            return 2 * JumpFlool(number - 1);
        return 0;
    }

代碼2(非遞歸)

int JumpFlool(int number)//變態青蛙跳臺階
    {
        return (int)pow(2, number - 1);
    }

代碼3(非遞歸)

int JumpFlool(int number)
    {
        if (1 == number)
            return 1;
        if (number <= 0)
            return 0;
        int a = 1;
        for (int i = 2; i <= number; i++)
        {
            a = a * 2;
        }
        return a;
    }

下面給出全部代碼和測試結果:

#include<iostream>
#include<math.h>
using namespace std;
class Solution
{
public:
    int jumpFloor(int number)//普通跳
{
    int a = 1;
    int b = 1;
    int c = 0;
    if (1 == number)
      return 1;
    if (number >= 2)
    {
        for (int i = 2; i <= number; i++)
      {
       c = a + b;
       a = b;
       b = c;
      }
       return c;
    }
    return 0;
}
    int jumpFloor(int number)//普通跳
        {
            if (number<=0)
                return 0;
            else if (1 == number)
                return 1;
            else if (2 == number)
                return 2;
            else
                return jumpFloor(number - 1) + jumpFloor(number - 2);
        }

    int JumpFlool(int number)//變態青蛙跳臺階
    {
        if (1 == number)
            return 1;
        if (number >= 2)
            return 2 * JumpFlool(number - 1);
        return 0;
    }
    int JumpFlool(int number)//變態青蛙跳臺階
    {
        return (int)pow(2, number - 1);
    }
    int JumpFlool(int number)//變態跳
    {
        if (1 == number)
            return 1;
        if (number <= 0)
            return 0;
        int a = 1;
        for (int i = 2; i <= number; i++)
        {
            a = a * 2;
        }
        return a;
    }
};
int main()
{
    Solution s;
    cout<<"普通跳5階方法:"<<s.JumpFlool(5)<<endl;
    /*cout << "變態跳5階方法:" << s.JumpFlool(5) << endl;*/
    system("pause");
    return 0;
}

測試結果:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章