2015-02-26 4 views
2

Я пытаюсь понять, как yield работает с рекурсией. Например, мы имеем следующую функцию в CoffeeScript, которая вычисляет факториал положительного целого числа и возвращает накопительный продукт:CoffeeScript: использование урожая с рекурсией

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} 
... 

Может кто explai Что здесь происходит? И как я должен изменить свой код, чтобы получить желаемые результаты? Благодаря!

ответ

2

Я получил эту работу со следующим в 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)` 
6

@phenomnomnominal, по состоянию на CoffeeScript 1.9.1, есть «выход из» за «выход *»:

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 } 
Смежные вопросы