/* 递归优化通用版,性能不如普通版,需要缓存每次调用结果, 即内部函数 */ function memoize(func, cache) { // 缓存池 cache = cache || {}; // 没有则新建 var result = function(arg) { // console.log("memoize count = " + count++); if (!cache.hasOwnProperty(arg)) { cache[arg] = func(arg); } }; return result; } // 使用 // 将阶乘函数缓存起来 // 只是优化了cache的通用性,但损失了一部分性能 var memOpfactorial = memoize(factorial, {"0": 1, "1": 1}); var f1 = memOpfactorial(6); var f2 = memOpfactorial(5); var f3 = memOpfactorial(4); // 结果次数依旧是:18次。因此不推荐使用
总结
谨慎使用递归,以防造成死循环,程序崩溃,或者调用栈溢出;
学会使用迭代来替代递归,可以避免递归调用栈或死循环问题出现;
查表法,递归的优化版:Memoization减少重复工作,提升性能。但不推荐使用通用版,相比普通版会损失部分性能。