一、斐波那契數定義
斐波那契數列又被稱為黃金分割數列,指 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ㄒ)/~~
有問題評論指出虛心接受,歡迎交流喔。(●'?'●)
浙公網安備 33010602011771號