2: Rekursi
Alvin Tjondrowiguno
Segitiga Sierpinski
Hal yang rekursif adalah sesuatu
yang definisinya mencakup dirinya sendiri
Dalam pemrograman, rekursi adalah ketika suatu fungsi memanggil dirinya sendiri
"Tumpukan Panggilan"
• Push: Menambahkan item baru ke atas
• Pop: Hapus item paling atas dengan 2 operasi utama:
Tumpukan adalah struktur data berurutan
tumpukan
dari tumpukan
otomatis dikelola oleh
fungsi yang sedang aktif di a
• Tumpukan panggilan disembunyikan dan tentang subrutin mana /
program
struktur yang menyimpan informasi
• Tumpukan panggilan adalah tumpukan data
penyusun
A() dorongan
utama()
A()
B() dorongan
utama()
C()
utama() B()
dorongan
A()
B()
utama() C()
muncul
A()
A() B()
muncul
utama()
A()
muncul
utama()
...
Halo()
utama()
Halo()
Halo()
Pengulangan
= 6*120 = 720
*
6! = 6*5
5! = *
* 2
2 1 = 120
* 1 = 720
4 *
*
3
5 4 3
6! = 6*5!
* *
N! = n * (n-1)!
kembali n }
* faktorial(n-1);
faktorial int statis publik(n) {
System.out.println(faktorial(6));
public static void main(String args[]) {
}
“Kasus dasar”
“Kasus rekursif”
TAPI 1! = 1 N! = n * (n-1)!
kembali 1;
* faktorial(n-1);
jika (n == 1)
faktorial int statis publik(n) {
kembali n
jika (n == 1)
* faktorial(n-1);
kembali 1;
faktorial int statis publik(n) {
kembali n }
faktorial(6)
utama()
faktorial(6)
utama() faktorial(1)
faktorial(5) faktorial(5)
faktorial(1)
... ...
fibo(1) = 1, fibo(2) = 1, fibo(3) = 2, fibo(4) = 3, fibo(5) = 5, …
fibo(1) = fibo(2) = 1
fibo(i) = fibo(i - 1) + fibo(i - 2) 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
// kasus rekursif
// kasus dasar
fibo(3)
fibo(2)
fibo(2) fibo(4)
fibo(1) fibo(3)
fibo(5)
fibo(1)
fibo(2)
hasil = 1 kembali (n * faktorial(n - 1))
untuk saya = n ke 1:
Mana yang menggunakan lebih banyak memori?
jika n == 1: kembalikan 1
faktorial(n):
faktorial(n):
Mana yang lebih cepat?
hasil = hasil * i
jumlah perkalian
Petunjuk: Unit dasar memori adalah
Petunjuk: Operasi dasarnya adalah
• Fungsi rekursif memerlukan setidaknya satu kasus dasar dan satu kasus rekursif
• Rekursi secara umum sama efisiennya dengan waktu seperti perulangan, namun kurang efisien dalam ruang
• Memanggil terlalu banyak fungsi tanpa kembali menyebabkan kesalahan stack overflow
• Rekursi lebih mudah dipahami setelah memahami tumpukan panggilan
penyelesaian masalah yang sama tetapi lebih kecil
• Rekursi selalu dapat digantikan dengan loop dan stack
• Rekursi harus dipertimbangkan ketika suatu masalah dapat diselesaikan dengan menggunakan
“Untuk memahami rekursi, Anda harus memahami rekursi terlebih dahulu.”
Menara Hanoi
Contoh Soal:
disk yang lebih kecil
• Hanya satu disk yang dapat dipindahkan pada a
• Disk yang lebih besar tidak dapat diletakkan di atasnya kutub lain (misalnya dari A ke C)
waktu, dari satu kutub ke kutub lainnya pindahkan semua disk dari satu kutub ke
• Tujuan dari permainan ini adalah untuk
B
A C
C
Kasus dasar B
A
Rekursif
kasus
1 2 3
• Pindahkan apapun yang ada di atas disk ke-n ke kutub sementara B
• Pindahkan semua piringan pada tiang sementara B ke atas tiang C
• Untuk memindahkan n disk dari kutub A ke kutub C, solusi umumnya adalah:
Solusi rekursif untuk Menara Hanoi:
• Pindahkan disk ke-n ke kutub C yang kosong
• Namun jika disk yang ada hanya 1 (n == 1), langsung pindahkan disk tersebut dari A ke C
Minggu depan: Algoritme dasar: Penyortiran dan pencarian
Terima kasih untuk mendengarkan!