Pertimbangkan masalah lama yang terkenal :
Dalam matematika, pembagi persekutuan terbesar (gcd)… dari dua atau lebih bilangan bulat bukan nol, adalah bilangan bulat positif terbesar yang membagi bilangan tanpa sisa.
Definisi dari gcd sangat sederhana:
dimana mod adalah operator modulo (yaitu, sisa setelah pembagian integer).
Dalam bahasa Inggris, definisi ini mengatakan pembagi persekutuan terbesar dari semua bilangan dan nol adalah bilangan itu, dan pembagi persekutuan terbesar dari dua bilangan m dan n adalah pembagi persekutuan terbesar dari n dan sisa setelah membagi m dengan n .
Jika Anda ingin tahu mengapa ini berhasil, lihat artikel Wikipedia tentang algoritma Euclidean .
Mari kita hitung gcd (10, 8) sebagai contoh. Setiap langkah sama dengan yang sebelumnya:
- gcd (10, 8)
- gcd (10, 10 mod 8)
- gcd (8, 2)
- gcd (8, 8 mod 2)
- gcd (2, 0)
- 2
Pada langkah pertama, 8 tidak sama dengan nol, jadi definisi bagian kedua berlaku. 10 mod 8 = 2 karena 8 masuk ke 10 sekali dengan sisa 2. Pada langkah 3, bagian kedua berlaku lagi, tapi kali ini 8 mod 2 = 0 karena 2 membagi 8 tanpa sisa. Pada langkah 5, argumen kedua adalah 0, jadi jawabannya adalah 2.
Apakah Anda memperhatikan bahwa gcd muncul di sisi kiri dan kanan dari tanda sama dengan? Seorang ahli matematika akan mengatakan definisi ini rekursif karena ekspresi yang Anda definisikan berulang di dalam definisinya.
Definisi rekursif cenderung elegan. Misalnya, definisi rekursif untuk penjumlahan daftar adalah
sum l =
if empty(l)
return 0
else
return head(l) + sum(tail(l))
di mana head
elemen pertama dalam daftar dan tail
sisa daftar. Perhatikan bahwa sum
berulang dalam definisinya di bagian akhir.
Mungkin Anda lebih suka nilai maksimum dalam daftar:
max l =
if empty(l)
error
elsif length(l) = 1
return head(l)
else
tailmax = max(tail(l))
if head(l) > tailmax
return head(l)
else
return tailmax
Anda dapat mendefinisikan perkalian bilangan bulat non-negatif secara rekursif untuk mengubahnya menjadi serangkaian penambahan:
a * b =
if b = 0
return 0
else
return a + (a * (b - 1))
Jika sedikit tentang mengubah perkalian menjadi serangkaian penjumlahan tidak masuk akal, coba kembangkan beberapa contoh sederhana untuk melihat cara kerjanya.
Merge sort memiliki definisi rekursif yang bagus:
sort(l) =
if empty(l) or length(l) = 1
return l
else
(left,right) = split l
return merge(sort(left), sort(right))
Definisi rekursif ada di mana-mana jika Anda tahu apa yang harus dicari. Perhatikan bagaimana semua definisi ini memiliki kasus dasar yang sangat sederhana, misalnya , gcd (m, 0) = m. Kasus rekursif mengecilkan masalah untuk mendapatkan jawaban yang mudah.
Dengan pemahaman ini, Anda sekarang dapat menghargai algoritme lain di artikel Wikipedia tentang rekursi !