今天看书,有个挺好的部分,构造了一个带有功能记忆的函数,分享一下;
😊
简单粗暴的实现斐波那契;
let fib = function (n) {
retturn n < 2 ? n : fib(n - 1) + fib(n - 2);
}
for (let i = 0; i <= 10; i++) {
console.log(i + ":" + fib(i));
}
//0:0
//1:1
//2:1
//3:2
//4:3
//5:5
//6:8
//7:13
//8:21
//9:34
//10:55
上面虽然能实现,但是做了很多无谓的工作;我们可以让函数有记忆功能来减少运算!
const fibnacci = function () {
const memo = [0, 1];
const fib = function (n) {
let result = memo[n];
if (typeof result !== 'number') {
result = fib(n - 1) + fib(n - 1);
memo[n] = result;
}
return result;
};
return fib;
};
还可以进一步优化成记忆的公共函数,也可运用阶乘等;
//记忆函数
/**
**@param memo 数组类型
**@param formula 匿名函数
**/
let memoizer = function (memo, formula) {
let recur = function (n) {
let result = memo[n];
if (typeof result !== "number") {
result = formula(recur, n);
memo[n] = result;
}
return result;
};
return recur;
};
//记忆函数调用——斐波那契数列
let fibonacci = memoizer([0, 1], function (recur, n) {
return recur(n - 1) + recur(n - 2);
});
//记忆函数调用-基本阶乘
let factorial = memoizer([1, 1], function (recur, n) {
return n * recur(n - 1);
});