转载自 个人博客 面试
斐波那契数列你们应该再熟悉不过了,平时面试也常常会被问到,然而不知道你们有没有考虑过它的效率呢?缓存
咱们通常给出的代码应该是这样的:闭包
function fibonacci(n) { if(n==0 || n == 1) return n; return fibonacci(n-1) + fibonacci(n-2); }
这段代码逻辑彻底没问题,可是若是你稍测试一下可能就会发现问题了,好比能够试一下 fibonacci(70)
,这时你可能吃个饭回来它还没执行完。测试
之因此叫它“变态版”,是由于在fibonacci(1000)
如下基本能够在 5 毫秒以内完成,效率提高了 Infinity 倍,然而为何差距这么大?咱们先看个图:优化
这是n = 5
的时候的计算过程,显而易见,它包含了不少次重复的计算,优化它也很简单,咱们只须要加个缓存(这里用到了闭包),代码以下:spa
var fibonacci = (function() { // 这里我用了 Map,用普通对象也是能够的 var cache = new Map(); return function(n){ if(n == 0 || n == 1){ cache.set(n,n); return n; } var v1 = cache.get(n-1) ? cache.get(n-1):fibonacci(n-1); var v2 = cache.get(n-2) ? cache.get(n-2):fibonacci(n-2); var nVal = v1 + v2; cache.set(n, nVal); return nVal; } })()