关于fibonacci数列用JS写的一点小优化
直接上代码
1 var month = prompt("请输入月数:") 2 3 function fibobo(x) { 4 //先定义一个已有前两项的数组,用来作缓存 5 var arr = [1, 1]; 6 7 (function fib(n) { 8 if (n === 0 || n === 1) { 9 return 1; 10 } 11 12 //第一次执行n >= 2的值后,就往arr数组中添加 fib(n-1)+fib(n-2) 的值 13 //即:如果arr数组中不包含 fib(n-1)+fib(n-2) 的值 ,就添加保存 14 if (!arr[n]) { 15 arr.push(fib(n - 1) + fib(n - 2)); 16 return arr[n]; 17 } 18 //当arr数组中保存有 fib(n-1)+fib(n-2) 的值 ,就直接返回该值 19 else { 20 return arr[n]; 21 } 22 })(x); 23 24 return arr[x - 1]; 25 } 26 27 console.time('优化后方案') 28 console.log(month+"个月后有"+fibobo(month)+"只兔子"); 29 30 console.timeEnd('优化后方案') 31 32 function fib(n) { 33 if (n<=2){ 34 return 1 ; 35 } 36 return fib(n -1 ) + fib(n - 2); 37 } 38 39 console.time('优化前方案') 40 console.log(month+"个月后有"+fib(month)+"只兔子"); 41 console.timeEnd('优化前方案');
generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。
generator由 function* 定义(注意多出的*
号),并且,除了 return 语句,还可以用 yield 返回多次。
function* fib(max) { var t, a = 0, b = 1, n = 0; while (n < max) { yield a; [a, b] = [b, a + b]; n ++; } return; } var f = [] for(var x of fib(200)){ f.push(x) } console.log(f)