LeetCode JavaScript 30 Days Challenge – Day29 – 2648. Generate Fibonacci Sequence

    LeetCode JavaScript 30 Days Challenge

    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.

    寫一個生成器函式,回傳一個產生斐波那契數列的生成器物件。
    斐波那契數列由 Xn = Xn-1 + Xn-2 定義。
    該系列的前幾個數字是 0、1、1、2、3、5、8、13。
    

    Example 1:

    Input: callCount = 5
    Output: [0,1,1,2,3]
    

    Example 2:

    Input: callCount = 0
    Output: []
    

    solution:
    定義 generator (function*)生成器函式為一個斐波那契數列 fibGenerator:
    首先,定義初始化變數 a 為 0,變數 b 為 1,這是斐波那契數列的起始值。
    運用 while(true) 進入無窮迴圈,表示生成器會持續生成數列的項目。
    並在每次迭代中,使用 yield a 這個關鍵字,將目前的 a 的值作為生成器的輸出,並且暫停生成器的執行。
    接著,執行 b += a,將 b 的值加上 a,即將 b 更新為下一個斐波那契數列的值。
    再來,執行 a = b – a,將 a 更新為 b 減去 a 的值,即將 a 更新為下一個斐波那契數列的值。
    迴圈回到開頭,等待下一次迭代。
    每次呼叫 gen.next().value,即可獲得生成器的輸出,
    也就是斐波那契數列中的下一個項目,且只在需要時才生成一個項目,而不是一次性計算出整個數列。

    Code 1: Generator function* BigO(n)

    var fibGenerator = function*() {
        let a = 0,
            b = 1
        while (true) {
            yield a;
            let temp = a
            a = a + b
            b = temp
        }
    };
    

    FlowChart:
    Example 1

    const gen = fibGenerator();
    console.log(gen.next().value); // 0
    console.log(gen.next().value); // 1
    console.log(gen.next().value); // 1
    console.log(gen.next().value); // 2
    console.log(gen.next().value); // 3
    

    Example 2

    console.log(gen.next()); //{ value: 0, done: false }
    

    Code 2: Generator function* BigO(n)

    var fibGenerator = function*() {
        let a = 0,
            b = 1
        while (true) {
            yield a;
            [a, b] = [b, a + b]
        }
    };
    

    Code 3: Closure BigO(n)

    function fibonacciGenerator() {
      let a = 0;
      let b = 1;
    
      function getNextFibonacci() {
        const result = a;
        [a, b] = [b, a + b];
        return result;
      }
    
      return getNextFibonacci;
    }
    
    const getNextFib = fibonacciGenerator();
    
    console.log(getNextFib()); // 0
    console.log(getNextFib()); // 1
    console.log(getNextFib()); // 1
    console.log(getNextFib()); // 2
    console.log(getNextFib()); // 3