这个应该算是函数式编程吧。
斐波那契数列的一般版本
这个版本会进行很多无用的重复的运算,循环10次元算次数多达453次。
var fibonacci = function(n){
console.log(j++);
return n<2?n:fibonacci(n-1)+fibonacci(n-2);
};
var j = 1;
for(var i = 0;i <= 10;i+=1)
{
console.log('//'+i+': '+fibonacci(i));
}
通过记忆改编的版本
首先用一个数组保存每次的运算结果,在每次调用之前先进行查找,去除了冗余的运算。
var mem_fibonacci = function(){
var memo = [0,1];
var fib = function(n){
var result = memo[n];
if (typeof(result) !== 'number') {
result = fib(n-1)+fib(n-2);
memo[n] = result;
};
return result;
};
return fib;
};
var test = mem_fibonacci();
for(var i = 0;i <= 10;i+=1)
{
console.log('//'+i+': '+test(i));
}
生产函数的函数
var memoizer = function(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 memo = [0,1];
var func = function(shell,n){
return shell(n-1)+shell(n-2);
}
var de_mem_fibonacci = memoizer(memo,func);
for(var i = 0;i <= 10;i+=1)
{
console.log('//'+i+': '+de_mem_fibonacci(i));
}
使用记忆函数生成阶乘函数
memo = [1,1];
func = function(shell,n){
return n * shell(n-1);
}
var factorial = memoizer(memo,func);
console.log('factorial');
for(var i = 1;i <= 10;i+=1)
{
console.log('//'+i+': '+factorial(i));
}
以上来自javascript语言精粹。