青蛙跳台阶&&变态跳台阶

题目一:一只青蛙一次可以跳上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;
}

测试结果:
这里写图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值