js递归实现斐波那契数列及优化

斐波那契数列:
斐波那契数列指的是这样一个数列:

“ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,…”

这个数列从第3项开始,每一项都等于前两项之和。

递归求斐波那契数列
​ 这个函数的功能是求任意项的斐波那契数列

  //统计计算次数
        let count = 0

        function fibNumber(n) {
            count++
            if (n == 1 || n == 2)
                return 1

            return fibNumber(n - 1) + fibNumber(n - 2)
        }

        console.log(fibNumber(40))
        console.log(count)

 

 

输出结果及优化详述
  • 通过上图结果可以看到统计次数(count)值比数列值还要大
  • 举个例子fibNumber(5),递归求斐波那契数列第5项
  • 计算第5项,需要先计算第4项和第3项的值
  • 这样每个递归调用都触发了另外两个递归第4项和第3项的调用
  • 而获得第4项和第3项的值又触发他们各自两个项的调用
  • 一直到调用第1和2项结束这个规律
  • 如下图,第1项,第2项,第3项都重复计算
  • 也可以看到冗余计算的增长也是非常快速的

 

 

斐波那契数列优化递归函数
  • 函数外定义一个对象P1保存斐波那契数列结果
  • 函数中,先判断一下,P1对象中有没有保存过这一列的值
  • 如果有,就直接取出数据返回就行了
  • 如果没有,该怎么算怎么算
  • 把算不出来的结果保存到对象中
  • 再返回这个结果
  • 可以看到相比优化前的计算量,这个计算量还是大大的减少的
 
 //斐波那契数列优化

        let p1 = {}
        let count = 0

        function fibNumber(n) {
            if (p1[n]) {
                return p1[n]
            } else {
                count++
                if (n == 1 || n == 2)
                    return 1

                p1[n] = fibNumber(n - 1) + fibNumber(n - 2)
                return p1[n]
            }
        }
        console.log(fibNumber(40))
        console.log(count)

 

 


————————————————
版权声明:本文为CSDN博主「前端.木子李」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34485368/article/details/110096704

 

posted @ 2021-09-26 22:25  sam-zh  阅读(337)  评论(0编辑  收藏  举报