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)
| 归档时间: |
|
| 查看次数: |
1376 次 |
| 最近记录: |