【算法】斐波那契数列与跳台阶

一、斐波那契数列

斐波那契数列为1,1,2,3,5,8,13,21,34…等数组成的数列,用数学公式表达为

F(1) = 1;
F(2) = 2;
F(n) = F(n-1) + F(n-2); (n>=3,n∈N*);

二、代码实现(Javascript)

题目描述:要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
我的实现(利用递归):

function Fibonacci(n)
{
    var m = 0;
    if(n === 0) {
        m = 0;
    } else if (n === 1 || n === 2) {
        m = 1;
    } else {
        m = Fibonacci(n-1) + Fibonacci(n-2);
    }
    return m;
}

别人的实现(计算速度更快):

function Fibonacci(n)
{  
    if(n<=1) {return n;}
    else {
        var f0=0,f1=1,f2=0;
        for(var i=2;i<=n;i++){
            f2=f0+f1;
            f0=f1;
            f1=f2;
        }
        return f2;
    }
}

三、跳台阶

题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

我的实现思路:

一级台阶:1种跳法
二级台阶:2种跳法(1.1/2)
三级台阶:3种跳法(1.1.1/1.2/2.1)
四级台阶:5种跳法(1.1.1.1/1.1.2/1.2.1/2.1.1/2.2)

可以发现,与斐波那契数列类似。

还有一种思路是:

跳上第n层,青蛙可以是从第n-1层跳上去,也可以是从第n-2层跳上去(因为一次可以跳一阶或两阶)
因此,跳上第n阶的跳法,等于跳上n-1阶的跳法,加上跳上n-2阶的跳法
即f(n) = f(n-1) + f(n-2) ,n>2(n∈N+)

代码:

function jumpFloor(number)
{
    if(number <= 2){
        return number;
    }else {
        var f1 = 1,f2 = 2,f3 = 0;
        for(var i = 3;i<=number;i++){
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
        }
        return f3;
    }
}

别人的实现:

function jumpFloor(number)
{
    if (number < 2) {
        return 1
    }
    let arr = [1, 1]
    for (let i = 2; i <= number; i ++) {
        arr[i] = arr[i - 1] + arr[i - 2]
    }
    return arr[number]
}

四、变态跳台阶

题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

别人的实现:

function jumpFloorII(number)
{
    return 1<<(--number);
}

说明:“ << ”和“ >> ”为按位运算符。
左移“ << ”,比如说:1<<3(相当于1*(2*2*2)),先将1转为二进制数1,再左移三位,得到1000(二进制),转化为十进制之后是8。
右移“ >> ”也类似,比如说:14>>3,先将4转化为二进制数1110,再右移三位,得到0001,转换为十进制之后是1。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值