84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
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。
数据不缓存,栈就是这么挤爆的。
稍微修改一下,做个缓存就好了