【前端js】实现剑指offer|leetcode(七)——跳台阶/变态跳台阶/斐波那契数列

斐波那契数列题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39

思路

建立一个元素,存放斐波那契数列的每一项,从第二项开始遍历到第n项,根据相加规律得到新元素的值,最后return最后一项

代码

function Fibonacci(n)
{
 let a = [0, 1];
  if (n <= 0) {
    return a[0];
  }
  if (n === 1) {
    return a[1];
  }
  for (let i = 2; i <= n; i++) {
    a[i] = a[i - 1] + a[i - 2];
  }
  return a[n];
}
function Fibonacci(n,pre =0, next =1) {
    //尾递归优化版本
    if(n<=0) return pre;
    if(n===1) return next;
    return Fibonacci(n-1,next,pre+next);
}
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;
}

跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果。
思路
青蛙的最后一次跳法只有两种:一阶和二阶,所以
f(n)=f(n-1)+f(n-2),其实就是斐波那契数列,修改一下0,1的元素和输出的数组下标就可以了:

方法一,递归法

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

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

方法二,迭代法

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

//跳台阶
function jumpFloor(number) {
  // write code here
  let a = [1, 2];

  if (number === 1) {
    return a[0];
  }
  if (number === 2) {
    return a[1];
  }
  for (let i = 2; i <= number; i++) {
    a[i] = a[i - 1] + a[i - 2];
  }
  return a[number - 1];
}
jumpFloor(1);
jumpFloor(2);
jumpFloor(3);
jumpFloor(4);

变态跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路
因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级

跳1级,剩下n-1级,则剩下跳法是f(n-1)

跳2级,剩下n-2级,则剩下跳法是f(n-2)

所以f(n)=f(n-1)+f(n-2)+…+f(1)+f(0)

因为f(n-1)=f(n-2)+f(n-3)+…+f(1)+f(0)

所以f(n)=2*f(n-1) (n>1)

f(0)=0,f(1)=1,f(2)=2,f(3)=4……f(n)=2的n-1次方

代码

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

参考https://blog.csdn.net/sinat_36521655/article/details/80596061

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值