Generator dan rekursi
yield untuk lazy sequence + fungsi yang memanggil diri sendiri.
Pahami konsepnya
Generator adalah fungsi yang menghasilkan nilai satu per satu dengan yield: function* fib() { yield 1; yield 1; yield 2; } — setiap yield menjeda eksekusi dan menyerahkan nilai. Panggil .next() untuk maju satu langkah, atau iterasi dengan for-of. Generator adalah fondasi for-of, spread, dan async/await.
Rekursi adalah fungsi yang memanggil dirinya sendiri pada versi lebih kecil dari masalahnya. Kasus klasik: faktorial(n) = n * faktorial(n-1), dengan kasus dasar faktorial(0) = 1. Tanpa kasus dasar, rekursi berputar selamanya (stack overflow).
Kegunaan generator: lazy evaluation (fibonacci tanpa menyimpan semua), pipeline data, dan custom iterable. Rekursi: tree traversal, divide-and-conquer, dan backtracking.
Coba contoh kode
// generator
function* fibonacci(n) {
let a = 0, b = 1;
for (let i = 0; i < n; i++) {
yield a;
[a, b] = [b, a + b];
}
}
for (const f of fibonacci(8)) {
console.log(f); // 0 1 1 2 3 5 8 13
}
// rekursi
function faktorial(n) {
if (n <= 1) return 1; // kasus dasar
return n * faktorial(n - 1); // kasus rekursif
}
console.log(faktorial(5)); // 120Generator menghasilkan fibonacci secara lazy — satu nilai per panggilan next(). Rekursi faktorial berhenti di kasus dasar n<=1. Tanpanya, stack overflow.
Latihan singkat
Uji: faktorial(6) rekursif — harus `720`.