Algoritmika · Pelajaran 6 dari 10

Rekursi dan relasi rekurens

10 menit baca · BelajarCode

Relasi rekurens adalah rumus yang mendefinisikan suatu nilai dari nilai-nilai sebelumnya. Contoh terkenal adalah Fibonacci: F(n) = F(n - 1) + F(n - 2).

Contoh: menaiki tangga

Kamu menaiki tangga dengan n anak tangga. Setiap langkah, kamu naik 1 atau 2 anak tangga. Ada berapa cara berbeda untuk sampai di puncak?

Pikirkan langkah terakhir: kamu tiba di puncak dari anak tangga n - 1 (dengan langkah 1) atau dari n - 2 (dengan langkah 2). Jadi:

  • cara(n) = cara(n - 1) + cara(n - 2)
  • cara(1) = 1, cara(2) = 2
Banyak cara menaiki tangga
n12345678910
cara(n)123581321345589

Memoisasi: jangan hitung dua kali

Rekursi langsung untuk rumus ini sangat lambat, karena nilai yang sama dihitung berulang-ulang. Solusinya memoisasi: simpan hasil yang sudah dihitung.

Python
1from functools import lru_cache23@lru_cache(maxsize=None)4def cara(n):5    if n <= 2:6        return n7    return cara(n - 1) + cara(n - 2)89print(cara(10))10print(cara(50))
Keluaran
89
20365011074

Tanda @lru_cache di atas fungsi otomatis menyimpan hasil setiap panggilan. Tanpa memoisasi, cara(50) butuh miliaran panggilan. Dengan memoisasi, cukup sekitar 50.

Cara lain: dari bawah ke atas

Rekurens juga bisa dihitung dengan perulangan biasa, mulai dari nilai terkecil:

Python
1def cara_iteratif(n):2    if n <= 2:3        return n4    a, b = 1, 25    for _ in range(3, n + 1):6        a, b = b, a + b7    return b89print(cara_iteratif(10), cara_iteratif(50))
Keluaran
89 20365011074

Banyak soal, satu pola

Menyusun ubin 2 × 1 untuk menutupi papan 2 × n ternyata punya rekurens yang sama: ubin terakhir diletakkan tegak (sisa papan 2 × (n - 1)) atau dua ubin mendatar (sisa 2 × (n - 2)). Melatih diri menemukan "langkah terakhir" seperti ini adalah kunci soal rekurens.

Cek pemahaman

Rekurens f(n) = 2 × f(n - 1) dengan f(1) = 3. Berapa f(5)?

Latihan

Menara Hanoi

Pada teka-teki Menara Hanoi, banyak langkah minimum untuk memindahkan n cakram memenuhi f(n) = 2 × f(n - 1) + 1 dengan f(1) = 1. Hitung f(10) dengan rekursi, lalu tebak rumus langsungnya.

Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Python online.

Latih konsep ini

Tandai pelajaran ini selesai

Masuk ke aplikasi untuk mencatat kemajuan, lalu lanjutkan ke pelajaran berikutnya dari perangkat mana pun.

Buka di aplikasi