• JS实现斐波那契数列的几种方法及代码优化


    一、斐波那契数定义

       斐波那契数列又被称为黄金分割数列,指 1,1,2,3,5,8,13,21,... 等数列。

      在数学中有递推的方法定义: F(0)=0,F(1)=1, F(2)=1,F(n)=F(n-1)+F(n-2), ( ≥ 2,  ∈ N* )

      数列从第三项开始,每项等于前两项之和,以此类推。

    二、实现方法(递归和循环)

      1. 递归计算

    1 function fibonacci(n) {
    2     if(n < 0)throw new Error('需大于0');
    3     if (n == 1 || n == 2) {
    4         return 1
    5     };
    6     return fibonacci(n - 1) + fibonacci(n - 2);
    7 }
    8 fibonacci(10);

        优点:代码简洁易懂;

        缺点:数值越大时,每次进行重复计算,消耗内存,导致浏览器卡死情况;

      2. 递归计算,使用闭包保存到数组

     1 function fibonacci(n){
     2         if(n < 0) throw new Error('需大于0');
     3         let arr = [0,1];
     4         const calc = (n)=>{
     5             if(n < 2){
     6                 return arr[n];
     7             }
     8             if(arr[n] != undefined){
     9                 return arr[n];
    10             }
    11             let data = calc(n-1) + calc(n-2);
    12             arr[n] = data;
    13             return data;
    14         }
    15         return calc(n);
    16 }

        优化No.1的缺点,避免重复计算。

      3. 循环计算,使用数组实现

     1 function fibonacci(n){
     2             const arr = [0,1,1];
     3             if(n<0)throw new Error('需大于0');
     4             if(n>2){
     5                 for(let i=3;i<=n;i++){
     6                     arr[i]=arr[i-1]+arr[i-2];
     7                 }
     8             }
     9             return arr[n]
    10 }
    11 fibonacci(10);

        和No.2方式一样,将计算过的值存储到数组中,避免重复计算;

      4. 循环计算,使用变量实现

     1 function fibonacci(n){
     2     let prev=0;curr=1;total=0; // 初始值
     3     if(n<0)throw new Error('需大于0');
     4     if(n >= 0 && n <= 1)return n; 6     for(let i = 2;i<=n;i++){
     7         total=prev+curr;
     8         prev=curr;
     9         curr=total;
    10     }
    11     return total;
    12 }
    13 fibonacci(10); // 55 ?

      5.  循环计算,使用ES6变量的解构赋值实现

    1  function fibonacci(n) {
    2     let n1 = 1; n2 = 1;
    3     for (let i = 2; i < n; i++) {
    4         [n1, n2] = [n2, n1 + n2]
    5     }
    6     return n2;
    7  }
    8  fibonacci(10); // 55 ?

        同上,换了实现方法;

      6. 循环计算,使用Generator函数

     1  
    2
    function* fibonacci(){ 3 let [prev, curr] = [0,1]; 4 for(;;){ 5 yield curr; 6 [prev,curr]=[curr, prev+curr]; 7 } 8 } 9 const arr=[]; 10 for(let n of fibonacci()){ 11 if(n>30)break; // 传递的是n以内的数列 12 arr.push(n); // 不需要使用next(),得到斐波那契数列 13 } 14 const total = arr.reduce((val,cur)=>val+cur,0); // 计算数列总数 15 console.log( total); // 54
    16

        知识点: Generator函数、 for...of 、 reduce()

    三、问题点

      generator*()得到的数列是: 1,1,2,3,5,8,13,21

      计算数列之和结果是54,其他方式计算结果是55,

      有大佬可以解惑吗 /(ㄒoㄒ)/~~

      有问题评论指出虚心接受,欢迎交流喔。(●'◡'●)

  • 相关阅读:
    Python之黏包
    Python的subprocess模块
    (经典)TCP粘包分析
    python--数据类型bytes
    python socket编程
    Python之模块和包
    Memcache的客户端连接系列(二) Python
    Memcache的客户端连接系列(一) Java
    Stunnel客户端安装和配置
    分布式数据库中间件的实现原理介绍四:平滑扩容
  • 原文地址:https://www.cnblogs.com/anniey/p/15990659.html
Copyright © 2020-2023  润新知