《剑指Offer》JavaScript实战——斐波那契数列+跳台阶问题

牛客网练习题传送门

题目描述

    大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39
解题方法

    方法一:普通递归,但是容易出现调用栈溢出问题,而且随着调用层数增加,速度会很慢。最明显的就是,牛客网上递归版跑不通。

function Fibonacci(n)
{
    /* 方法一 递归,但是容易出现调用栈溢出的情况*/
    if(n<=0) return 0;
    if(n===1) return 1;
    return Fibonacci(n-1)+Fibonacci(n-2);
}

    方法二:迭代,代码稍微多那么几行,但是速度快啊!

function Fibonacci(n) {
    /* 方法二 迭代 */
    let pre = 0,
        next = 1,
        fib = 0;
    if(n<=0) return pre;
    if(n===1) return next;

    for(let i = 1;i<n;i++){
        fib = pre+next;
        pre = next;
        next = fib;
    }
    return fib;
}

    方法三:优化普通递归版本,变成尾递归优化。JS实现了尾调用优化。牛客网上也能跑,但是相当于修改了接口参数,在实际开发时不建议随便修改接口参数。

function Fibonacci(n,pre =0, next =1) {
    //尾递归优化版本
    if(n<=0) return pre;
    if(n===1) return next;
    return Fibonacci(n-1,next,pre+next);
}
跳台阶问题

    牛客网练习题传送门

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

    理解:青蛙跳台阶问题其实就是斐波那契数列数列。当0阶台阶时,0种跳法;当1阶台阶时,只有1种跳法;当2阶台阶时,有2中跳法。现假设n阶台阶可以有f(n)中跳法,那么第一次跳一级的情况下,剩下的跳法有f(n-1)种,第一次跳2级的情况下,剩下的跳法有f(n-2)种,即f(n)=f(n-1)+f(n-2).

    这就是斐波那契数列了嘛,只不过初始条件不太一样。附上一个迭代版的,其他版本的区别不大,改改初始条件即可。

function jumpFloor(number)
{
    // write code here
    let pre = 1,
        next = 1,
        fib = 0;
    if(number<=0) return 0;
    if(number===1) return next;

    for(let i = 1;i<number;i++){
        fib = pre+next;
        pre = next;
        next = fib;
    }
    return fib;
}
变态跳台阶问题

    牛客网练习题传送门

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

    思路:0阶时0种;1阶时1种;2阶时2种;3阶时3种......数学归纳法推导可知,假设n级台阶总有f(n)种跳法,则f(n)=2的(n-1)次方,即2^(n-1)种。代码可以说非常简单,利用Math的静态方法pow()即可

function jumpFloorII(number)
{
    // write code here
    if(number<=0) return 0;
    return Math.pow(2,number -1);
}

    

猜你喜欢

转载自blog.csdn.net/sinat_36521655/article/details/80596061
今日推荐