函数发生器javascript

use*_*717 3 javascript generator

我需要创建一个函数生成器,迭代无限序列,如斐波那契序列.它应该在调用时返回序列中的下一个值.我得到了一个函数原型:

function genfib() {
  return function fib() {
  }
}
Run Code Online (Sandbox Code Playgroud)

它应该像这样使用:

var fib = genfib();
fib(); // -> returns 0
fib(); // -> returns 1
fib(); // -> returns 1
fib(); // -> returns 2
Run Code Online (Sandbox Code Playgroud)

我很困惑每次打电话时都在执行什么fib().我试着做点什么

function genfib() {
  var count = 1;
  if (count === 1) {
    count++;
    yield 0;
  }
  else if (count === 2) {
    count++;
    yield 1;
  }
  var a = 0;
  var b = 1;
  return function fib() {
    while(1) {
      count = a + b;
      a = b;
      b = count;
      yield count;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我不知道如何设置它来运行序列中if/else的前两个数字fib,然后while为每个后续调用运行一次循环.

小智 7

如果你想使用ES6发生器yield,那么这里的方法是:

function *fibonacci() {
    var [prev, current] = [0, 1];

    while (true) {
        [prev, current] = [current, current+prev];
        yield current;
    }
}
Run Code Online (Sandbox Code Playgroud)

迭代结果的一种方法是使用for-of循环:

for (var v of fibonacci()) {
    console.log(v);
    if (v > 100) break;
}
Run Code Online (Sandbox Code Playgroud)

请注意,var [prev, current] =FF和Traceur支持解构分配,但目前不支持Chrome或节点.如有必要,将其重写为:

function *fibonacci() {
    var prev = 0, current = 1, oldprev;

    while (true) {
        oldprev = prev;
        prev = current;
        yield current += oldprev;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想要给出函数原型的语义,那么:

function genfib() {
    var iterator = fibonacci();
    return function fib() {
        return iterator.next().value;
    };
}
Run Code Online (Sandbox Code Playgroud)