这是一个最简单的斐波那契函数
函数1
function fibonacci(n){
return n<2?n:fibonacci(n-1)+fibonacci(n-2);
}
这个函数,当n达到50的时候,已经是要花很长时间求解,因为他重复做了大量已经计算过的东西
那么,需要对已算过的做缓存
想法1,利用闭包,如下
函数2
function closureFibonacci() {
var memory = [0,1];
function fib(n) {
if(typeof memory[n]!='undefined') return memory[n];
else {
var result = fib(n-1)+fib(n-2);
memory[n]=result;
return result;
}
}
return fib;
}
var fib = closureFibonacci();
这个fib是最终使用的fibonacci函数,由于闭包,函数可以访问上下文的memory,实现了缓存功能
在js语言精粹中,给出了一般化的构造记忆函数的函数如下
function memoizer (memo,fundamental){
var shell = function(n){
var result = memo[n];
if(typeof result !=='number'){
result = fundamental(shell,n);
memo[n]=result;
}
return result;
};
return shell;
}
var fibonacci = memoizer([0,1],function (shell,n) {
return shell(n-1)+shell(n-2);
});
利用这个函数,可以很方便的构造出其他的一些带有技能功能的函数
函数3
function objectFibonacci(n) {
if (typeof objectFibonacci.memory === 'undefined') objectFibonacci.memory = [0,1];
if(typeof objectFibonacci.memory[n]!='undefined') return objectFibonacci.memory[n];
else {
var result = objectFibonacci(n-1)+objectFibonacci(n-2);
objectFibonacci.memory[n]=result;
return result;
}
}
利用函数也是对象的特点,给它添加一个memory属性,来实现缓存