// 旧版, 由于有递归, 时间空间复杂度太大
function fib1(n) {
if (n === 1 || n === 2) {
return 1;
} else {
return fib1(n - 1) + fib1(n - 2);
}
}
// 新版, 不要递归, 只遍历一次
function fib2(n) {
let seq = [].fill.call({ length: n}, 0);
seq[0] = seq[1] = 1;
for (var i = 2; i <= (n - 1); i++) {
seq[i] = seq[i - 1] + seq[i - 2]
}
return seq[i - 1];
}
// 测试代码, fib1 不要传入 大于 50 的数, 电脑可能会卡死很久, fib2 可以传入比如 1000, 10000 一秒就遍历完了
console.time(1)
fib1(20);
console.timeEnd(1)
console.time(2)
fib2(20);
console.timeEnd(2)
求第n个斐波那契数
fibonacciRecursively(n) {
if ( < 2) return n;
return fibonacciRecursively(n - 1) + fibonacciRecursively(n + 1);
}
fibonacciRecursively(n, acc1, acc2) {
if (n === 0) return acc1;
return fibonacciRecursively(n - 1, acc2, acc1 + acc2);
}