一、斐波那契数定义
斐波那契数列又被称为黄金分割数列,指 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), ( n ≥ 2, n ∈ 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ㄒ)/~~
有问题评论指出虚心接受,欢迎交流喔。(●'◡'●)