javascript - 为什么浏览器计算斐波那契数列这么慢?
迷茫
迷茫 2017-04-11 11:59:27
0
5
433
function f(n) {
        return n < 2 ? n : f(n - 2) + f(n - 1);
    }
    
f(50)   

不考虑缓存计算结果,为什么Chrome算个f(50)就卡死呢?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

모든 응답(5)
大家讲道理

调用栈太深了

函数调用会在内存形成一个“调用记录”,又称“调用帧”(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);
}
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!