Pemrograman Dasar L A T I H A N M E T H O D / F U N G S I M E T H O D R E K U R S I F
Latihan 1 2 Buatlah program untuk menampilkan kuadrat dari suatu bilangan secara berulang sebanyak n kali 1. Buat method Header dengan tipe void (parameter judul bertipe String) ========================= PROGRAM KUADRAT BILANGAN ========================= 2. Buat method KuadratBilangan dengan tipe void (parameter n bertipe int) Contoh keluaran dengan input n = 10 : Kuadrat dari 1 adalah 1 Kuadrat dari 2 adalah 4 Kuadrat dari 3 adalah 9 Kuadrat dari 4 adalah 16 Kuadrat dari 5 adalah 25 Kuadrat dari 6 adalah 36 Kuadrat dari 7 adalah 49 Kuadrat dari 8 adalah 64 Kuadrat dari 9 adalah 81 Kuadrat dari 10 adalah 100
Latihan 2 Buatlah program untuk menghitung nilai rata-rata dari bilangan bertipe integer sebanyak n yang diinputkan oleh user 1. Buat method Header 2. Buat method Rata2Bilangan dengan tipe double (parameter banyaknya bilangan n bertipe integer) Contoh keluaran dengan input n = 4 : Masukkan bilangan 1 : 3 Masukkan bilangan 2 : 2 Masukkan bilangan 3 : 5 Masukkan bilangan 4 : 6 3 Rata-rata : 4.000
Method Rekursif Method Rekursif Method yang di dalamnya terdapat pernyataan yang memanggil dirinya sendiri Berguna untuk memecahkan masalah yang dapat didefinisikan secara rekursif pula. Contoh : Faktorial (n) atau n! didefinisikan sebagai berikut : jika n = 0, n! = 1 jika n > 0, n! = n * (n-1)! 4
Method Rekursif 5 Faktorial (n) atau n! didefinisikan sebagai berikut : jika n = 0, n! = 1 jika n > 0, n! = n * (n-1)! Misal n=4 : 4! = 4 * 3! 3! = 3 * 2! 2! = 2 * 1! 1! = 1* 0! 0! = 1 Jadi: 4! = 4*3*2*1= 24
Method Iteratif - Faktorial 4! = 4*3! = 4*3*2! = 4*3*2*1! = 4*3*2*1 = 24 decremental long faktorialiteratifdec(long n) { long i, faktorial = 1; for(i=n; i>=1; i--) faktorial *= i; return faktorial; } 4! = 1*2*3*4 = 24 incremental long faktorialiteratifinc(long n){ long i, faktorial = 1; for(i=1; i<=n; i++) faktorial *= i; return faktorial; } 6
Method Rekursif - Faktorial Contoh perhitungan 5 faktorial 5! (5 * 4!) (5 * (4 *3!)) (5 * (4 * (3 * 2!))) (5 * (4 * (3 * (2 * 1!)))) (5 * (4 * (3 * (2 * (1 * 0!))))) (5 * (4 * (3 * (2 * (1 * 1))))) (5 * (4 * (3 * (2 * 1)))) (5 * (4 * (3 * 2))) (5 * (4 * 6 )) (5 * 24) 120 7
Method Rekursif Fungsi rekursif mempunyai dua komponen yaitu: Base case: Mengembalikan nilai tanpa melakukan pemanggilan rekursi berikutnya. Rekursi berakhir jika base case dijumpai/dipenuhi Recursion call / Reduction step: Memanggil fungsi rekursif di dalam fungsi rekursif di atas 8 Menghubungkan sebuah fungsi rekursif dengan fungsi rekursif di dalamnya Biasanya memiliki keyword return untuk mengembalikan nilai ke fungsi yang memanggilnya
Fungsi faktorial Method Rekursif Base case: n = 0 Reduction step: f(n) = n * f(n-1) 9 // rekursif long faktorialrekursif(long n) { if(n==0) return (1); else return(n * faktorialrekursif(n-1)); }
Rekursif vs Iteratif 10 Faktorial - Rekursif long faktorial(long n) { if(n==0) return (1); else return(n*faktorial(n-1)); } Faktorial - Iteratif // dekremental long faktorial(long n) { } long i, faktorial = 1; for(i=n; i>=1; i--) faktorial *= i; return faktorial;
Rekursif vs Iteratif 11 Rekursif 1. Pengulangan dengan struktur seleksi (if-else) dan pemanggilan fungsi (dirinya sendiri) -> rekursi 2. Pengulangan berhenti saat base case dijumpai/dipenuhi (konvergen terhadap base case) 3. Pengulangan tanpa henti jika base case tidak pernah dijumpai/dipenuhi (tidak konvergen terhadap base case) 4. Biaya proses lebih tinggi dengan pemanggilan banyak fungsi (butuh memori lebih besar & kerja prosesor lebih tinggi) 5. Terbaca lebih jelas, model lebih dekat dengan masalah (contoh: faktorial, fibonacci) Iteratif 1. Pengulangan dengan struktur repetisi (for/while) 2. Pengulangan berhenti saat kondisi pengulangan bernilai salah (false) 3. Pengulangan tanpa henti jika kondisi pengulangan selalu benar 4. Biaya proses lebih rendah (kebutuhan memori lebih kecil & kerja prosesor lebih rendah) karena proses pengulangan berada dalam satu fungsi 5. Terbaca kurang jelas, model kurang dekat dengan masalah (contoh: faktorial, fibonacci)
Kekurangan Rekursif Meskipun penulisan program dengan cara rekursif bisa lebih jelas dan pendek, namun fungsi rekursif memerlukan : 12 Memori yang lebih banyak untuk mengaktifkan stack (memori yang digunakan untuk pemanggilan method). Waktu lebih lama untuk menjejaki setiap rekursi melalui stack. Apakah stack?
Kapan menggunakan Rekursif? Secara umum, hanya jika : Penyelesaian sulit dilaksanakan secara iteratif Efisiensi dengan cara rekursif masih memadai Efisiensi bukan masalah dibandingkan dengan kejelasan logika program 13 Tidak mempertimbangkan faktor penghematan memori dan kecepatan eksekusi program Kecepatan kerja dan penghematan memori (iteratif) VS Perancangan logika yang baik (rekursif)
Bilangan Fibonacci Urutan bilangan 0, 1, 1, 2, 3, 5, 8, 13 disebut bilangan Fibonacci. Hubungan antara satu angka dengan angka berikutnya didefinisikan secara rekursif sebagai berikut : Fib(N) = N, jika N = 0 atau 1 Fib(N) = Fib(N-2) + Fib(N-1), jika N >= 2 14
Bilangan Fibonacci int slow_fib(int n) { int f; if(n==0) f = 0; else if(n==1) f = 1; else f = slow_fib(n-2) + slow_fib(n-1); return f; } Method slow_fib() di atas ditulis secara rekursif Tulislah fast_fib() jika menggunakan iterasi. 15
Bilangan Fibonacci Contoh : Skema fibonacci jika N=4 16 FIB (4) FIB (3) FIB (2) FIB (2) FIB (1) FIB (1) FIB (0) FIB (1) FIB (0)
Tugas 1 Buatlah program untuk permasalahan bilangan Fibonacci menggunakan iterasi int slow_fib(int n) { int f; if(n==0) f = 0; else if(n==1) f = 1; else f = slow_fib(n-2) + slow_fib(n-1); return f; } 17
Tugas 2 18 Buatlah program untuk permasalahan perpangkatan suatu bilangan menggunakan rekursif Contoh: 4 5