84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
function f(n) { return n < 2 ? n : f(n - 2) + f(n - 1); } f(50)
不考虑缓存计算结果,为什么Chrome算个f(50)就卡死呢?
业精于勤,荒于嬉;行成于思,毁于随。
调用栈太深了
函数调用会在内存形成一个“调用记录”,又称“调用帧”(call frame),保存调用位置和内部变量等信息。如果在函数A的内部调用函数B,那么在A的调用帧上方,还会形成一个B的调用帧。等到B运行结束,将结果返回到A,B的调用帧才会消失。如果函数B内部还调用函数C,那就还有一个C的调用帧,以此类推。所有的调用帧,就形成一个“调用栈”(call stack)。
可以考虑使用数组/对象缓存或是尾递归优化(TCO)数组缓存的方式:
var fibArr =[0,1,1]; function fibonacci(n){ return fibArr[n]? fibArr[n]:(fibArr[n]=fibonacci(n-1)+fibonacci(n-2)); }
http://es6.ruanyifeng.com/#do...尾调用优化http://blog.csdn.net/ntoskiki... 解决方案
数据计算 爆炸
何不试试用C语言,
因为你计算10的时候实际上算过了9和8
算11的时候又算了10和9,算这个10的时候又算了9和8。
数据不缓存,栈就是这么挤爆的。
稍微修改一下,做个缓存就好了
let fibs = {0:0, 1:1, 2:1}; function f(n) { if(fibs[n] !== undefined) return fibs[n]; return fibs[n] = f(n-2) + f(n-1); }
调用栈太深了
可以考虑使用数组/对象缓存或是尾递归优化(TCO)
数组缓存的方式:
http://es6.ruanyifeng.com/#do...尾调用优化
http://blog.csdn.net/ntoskiki... 解决方案
数据计算 爆炸
何不试试用C语言,
因为你计算10的时候实际上算过了9和8
算11的时候又算了10和9,算这个10的时候又算了9和8。
数据不缓存,栈就是这么挤爆的。
稍微修改一下,做个缓存就好了