实现斐波那契数列,可以通过递归和动态规划的方式实现,现在要求把计算过的变量存储起来,之后用到的时候不必重复计算,此处就用到了闭包
// 0, 1, 1, 2, 3, 5, 8...
var fib = (function() {
var arr = [0, 1, 1];// 也必须得是3个
return function(n){
var res = arr[n];
if (res) {
return res;
} else {
arr[n] = fib(n-1) + fib(n-2);
return arr[n];
}
}
})()
console.log(fib(2))
console.log(fib(5))
function fib(){
var arr = [0, 1, 1];// 必须得初始化3个,两个不行 arr = [0, 1]
return function(n){
var res = arr[n];
if(!res) {
res = arr[n] = fn(n-1) + fn(n-2);
}
return res;
}
}
var fn = fib();
console.log(fn(2));
console.log(fn(5))
动态规划实现
// 统计当前数字有多少个第一项,多少个第二项
// 1, 1, 2, 3, 5
function fibCount(n) {
if (n < 0) return -1;
let dp1 = [1, 0], dp2 = [0, 1];
for(let i = 2; i <= n; i++) {
dp1[i] = dp1[i-1] + dp1[i-2];
dp2[i] = dp2[i-1] + dp2[i-2];
}
return [dp1[n], dp2[n]]
}
function fib(n) {
if (n <= 1) return 1;
let dp = [1,1]
for(let i = 2; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
let res = fibCount(50);
console.log(res)
console.log(res[0]+res[1])
let res1 = fib(50)
console.log(res1)