CoffeeScript:在递归中使用 yield
CoffeeScript: Using yield with recursion
我正在尝试了解 yield
如何使用递归。例如,我们在 CoffeeScript 中有以下函数计算正整数和 returns 当前累积积的阶乘:
prod = 1
f = (n) ->
if n > 0
prod = n * prod
yield prod
f(n-1)
因此,如果我们用 a = f(3)
调用此函数并单步执行 a.next()
,我希望看到类似
的结果
{value: 3, done: false} // prod = 3 * 1
{value: 6, done: false} // prod = 3 * 2
{value: 6, done: true} // prod = 3 * 2 * 1
然而,实际输出是
{value: 3, done: false}
{value: {}, done: false}
{value: undefined, done: true}
{value: undefined, done: true}
...
谁能解释一下这是怎么回事?我应该如何更改我的代码以获得所需的结果?谢谢!
我得到它是为了在 JS 中使用以下内容,运行 在 FireFox 中:
var prod = 1;
var f = function*(n) {
if (n > 0) {
prod = n * prod;
yield prod;
yield* f(n - 1);
}
};
a = f(3);
console.log(a.next()); // Object { value: 3, done: false }
console.log(a.next()); // Object { value: 6, done: false }
console.log(a.next()); // Object { value: 6, done: false }
console.log(a.next()); // Object { value: undefined, done: true }
但是,CoffeeScript 似乎还不支持 yield*
。可能是某人为该项目做出贡献的好机会!为了暂时解决这个问题,您可以使用反引号来传递 JS:
prod = 1
f = (n) ->
if n > 0
prod = n * prod
yield prod
`yield* f(n-1)`
@phenomnomnominal,从 CoffeeScript 1.9.1 开始,"yield*" 有 "yield from":
prod = 1
f = (n) ->
if n > 0
prod = n * prod
yield prod
yield from f(n-1)
gen = f(3)
loop
ngen = gen.next()
console.log ngen
break if ngen.done
这应该产生:
{ value: 3, done: false }
{ value: 6, done: false }
{ value: 6, done: false }
{ value: undefined, done: true }
我正在尝试了解 yield
如何使用递归。例如,我们在 CoffeeScript 中有以下函数计算正整数和 returns 当前累积积的阶乘:
prod = 1
f = (n) ->
if n > 0
prod = n * prod
yield prod
f(n-1)
因此,如果我们用 a = f(3)
调用此函数并单步执行 a.next()
,我希望看到类似
{value: 3, done: false} // prod = 3 * 1
{value: 6, done: false} // prod = 3 * 2
{value: 6, done: true} // prod = 3 * 2 * 1
然而,实际输出是
{value: 3, done: false}
{value: {}, done: false}
{value: undefined, done: true}
{value: undefined, done: true}
...
谁能解释一下这是怎么回事?我应该如何更改我的代码以获得所需的结果?谢谢!
我得到它是为了在 JS 中使用以下内容,运行 在 FireFox 中:
var prod = 1;
var f = function*(n) {
if (n > 0) {
prod = n * prod;
yield prod;
yield* f(n - 1);
}
};
a = f(3);
console.log(a.next()); // Object { value: 3, done: false }
console.log(a.next()); // Object { value: 6, done: false }
console.log(a.next()); // Object { value: 6, done: false }
console.log(a.next()); // Object { value: undefined, done: true }
但是,CoffeeScript 似乎还不支持 yield*
。可能是某人为该项目做出贡献的好机会!为了暂时解决这个问题,您可以使用反引号来传递 JS:
prod = 1
f = (n) ->
if n > 0
prod = n * prod
yield prod
`yield* f(n-1)`
@phenomnomnominal,从 CoffeeScript 1.9.1 开始,"yield*" 有 "yield from":
prod = 1
f = (n) ->
if n > 0
prod = n * prod
yield prod
yield from f(n-1)
gen = f(3)
loop
ngen = gen.next()
console.log ngen
break if ngen.done
这应该产生:
{ value: 3, done: false }
{ value: 6, done: false }
{ value: 6, done: false }
{ value: undefined, done: true }