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