斐波那契数列
斐波那契数列由 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)
- 递归
const fib = (n) => {
if(n <= 1) { return n; }
return fib(n - 1) + fib(n - 2);
}
- 记忆化自底向上
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];
}
- 记忆化自顶向下
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);
}
- 迭代
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;
}
- 迭代优化
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;
}
- 动态规划
状态定义: 设 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…