关于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)

 

posted on 2017-02-23 22:56  凛冬  阅读(142)  评论(0编辑  收藏  举报