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ㄒ)/~~

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