斐波那契数列 (JS实现)

394 阅读2分钟

斐波那契数列

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

F(0) = 0,   
F(1) = 1,
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144... ,这个数列从第3项开始,每一项都等于前两项之和。

给定 N,计算 F(N)

  1. 递归
const fib = (n) => {
  if(n <= 1) { return n; }
  return fib(n - 1) + fib(n - 2);
}
  1. 记忆化自底向上
const fib = (n) => {
  if(n <= 1) { return n; }
  let cache = new Array(n+1).fill(0);
  cache[0] = 0;
  cache[1] = 1;

  for(let i = 2; i <= n; i++){
  	cache[i] = cache[i-1] + cache[i-2];
  }
  return cache[n];
}
  1. 记忆化自顶向下
let cache = new Array(31).fill(null);

const fib = (n) => {
  if(n <= 1) { return n; }
  cache[0] = 0;
  cache[1] = 1;
  return memoize(n);
}

const memoize = (n) = >{
  if (cache[n] != null) {
    return cache[n];
  }
  cache[n] = memoize(n - 1) + memoize(n - 2);
  return memoize(n);
}
  1. 迭代
const fib = (n) => {
  if(n <= 1) { return n; }

  let sum = 0; //存储第 n 项的值
  let one = 1; //存储第 n-1 项的值
  let two = 0; //存储第 n-2 项的值
  
  for(let i = 2; i <= n; i++){
      sum = one + two;
      two = one;
      one = sum;
  }
  return sum;
}
  1. 迭代优化
const fib = (n) => {
  if(n <= 1) { return n; }

  let sum = 1; //存储第 n-1 项的值
  let one = 0; //存储第 n-2 项的值
  
  for(let i = 2; i <= n; i++){
      sum = sum + one;
      one = sum - one;
  }
  return sum;
}
  1. 动态规划

状态定义: 设 dp 为一维数组,其中 dp[i] 的值代表 斐波那契数列第 i 个数字 。 转移方程: dp[i+1]=dp[i]+dp[i−1] ,即对应数列定义 f(n+1)=f(n)+f(n−1) ; 初始状态: dp[0]=0, dp[1]=1 ,即初始化前两个数字; 返回值: dp[n],即斐波那契数列的第 n 个数字。

const fib = (n) = >{
  if (n == 0) return 0;
  let dp = new Array(n + 1);
  dp[0] = 0;
  dp[1] = 1;
  for (let i = 2; i <= n; i++) {
    dp[i] = dp[i - 1] + dp[i - 2];
  }
  return dp[n];
}

LeetCode相关题

面试题10- I. 斐波那契数列
leetcode-cn.com/problems/fe…

509.斐波那契数
leetcode-cn.com/problems/fi…

面试题10- II. 青蛙跳台阶问题
leetcode-cn.com/problems/qi…

70.爬楼梯
leetcode-cn.com/problems/cl…