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

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

Lisa Kudrow
Lisa Kudrow

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

全部回覆 (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學習者快速成長!