斐波那契数
先看下斐波那契数: 斐波那契数,通常用
F(n)
表示,形成的序列称为 斐波那契数列 。该数列由0
和1
开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
递归
- 找到边界情况
- 然后第n个等于第n - 1 个 加上 第 n - 2个
function fib(n) {
// step1
if (n < 2) return n
// step2
return fib(n - 1) - fib(n - 2)
}
尾递归
记录第n - 1 和 n - 2 的值n1, n2, 从0开始变动n1, n2的值 等于 0 和 1的时候是边界情况
function fib(n, n1 = 1, n2 = 0) {
if (n === 0) return n2
if (n === 1) return n1
return fib(n - 1, n1 + n2, n1)
}
递归
数数,用一个数组记录第n个的值,然后取第n个
function fib(n) {
// 创建一个长度n - 1的数组, 因为要取第n个的值
const ret = Array.from({ length: n + 1})
// 边界情况
ret[0] = 0
ret[1] = 1
// 比那里记录第i个应该是什么值
for (let i = 2; i <= n; i++) {
ret[i] = ret[i - 1] + ret[i - 2]
}
return ret[n]
}
递归优化
我们只用到了3个变量, 第n个, 第n-1个, 第n-2个,通过这3个变量的变动来确定第n个
function fib(n) {
// 边界情况
if (n < 2) return n
// 3变量
// n, n - 1, n - 2
let r = 1, p = 1, q = 0
for (let i = 2; i <=n; i++) {
r = p + q
q = p
p = r
}
return r
}