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