문제

Write a generator function that returns a generator object which yields the fibonacci sequence.

The fibonacci sequence is defined by the relation Xn = Xn-1 + Xn-2.

The first few numbers of the series are 0, 1, 1, 2, 3, 5, 8, 13.

 

예제

gen.next().value는 호출할 때마다 피보나치의 다음 숫자가 출력된다.

 

gen.next()가 호출되지 않았으므로 아무것도 출력되지 않는다.

 


코드

/**
 * @return {Generator<number>}
 */
var fibGenerator = function*() {
    const fib = [0, 1];
    let idx = 0;
    
    yield 0;
    idx += 1;
    
    yield 1;
    idx += 1;
    
    while (idx <= 50) {
        fib.push(fib[fib.length - 2] + fib[fib.length - 1]);
        idx += 1;
        
        yield fib[fib.length - 1]
    }
};

/**
 * const gen = fibGenerator();
 * gen.next().value; // 0
 * gen.next().value; // 1
 */

 

JavaScript의 generator는 언제든지 실행을 중지하고 재개할 수 있는 함수로, 내부의 변수 값들은 출입 과정에서 저장된 상태로 남아있습니다.

Generator 함수는 호출되어도 즉시 실행되지 않는 대신 Iterator 객체가 반환됩니다.

이후 Iterator의 next() 메서드를 호출하면 Generator 함수가 실행되어 yield 문을 만날때까지 진행하고, 반환값은 다음과 같습니다.

 

`{value: <반환값>, done: <완료 여부>}`

 

만약 정상적으로 yield문을 만났다면 해당 반환값이 value에 담기고, done에는 false가 담겨있게 됩니다. 만약 yield문을 만나지 못하고 함수가 종료되었을 경우, value 값에는 undefined가 담기고 done에는 함수 실행을 모두 완료했다는 의미로 true가 담기게 됩니다.

 

+ Recent posts