Recursion Properties base case, problem paling sederhana yang memproses input tanpa perlu recursive lagi. recursive case: 1. membagi problem menjadi bagian yang lebih kecil. 2. memanggil fungsi secara recursive untuk setiap bagian 3. menggabungkan solusi tiap bagian ke menjadi solusi dari problem utama. 04-Mar-04 IKI10100 - PM 1 Factorial: static public int factorial( int n) { // return n! if( n <= 1) // base case return 1; else return n * factorial(n-1); 04-Mar-04 IKI10100 - PM 2 MaxSubseqSum Recursive version MaxSubseqSum Recursive version Case 1: Max sum dihasilkan oleh elemen di paruh pertama Case 2: Max sum dihasilkan oleh elemen di paruh kedua Case 3: Max sum dihasilkan oleh elemen awal di paruh pertama dan berakhir di paruh kedua public int maxsubsum (int[ ] a) { return maxsumrec(a, 0, a.length-1); private int maxsumrec(int[ ] a, int left, int right) { int center = (left+right)/2; cari index tengah Case 1 Case 2 if(left == right) return a[left] > 0? a[left] : 0; base case Case 3 int maxleftsum = maxsumrec(a, left, center); cari max di paruh kiri Pilih dari ketiganya yang menghasilkan nilai terbesar. 04-Mar-04 IKI10100 - PM 3 int maxrightsum = maxsumrec(a, center+1, right);. cari max di paruh kanan 04-Mar-04 IKI10100 - PM 4
MaxSubseqSum Recursive Version Recursive Version for(int i=center; i>=left; i--) { leftbordersum += a[i]; if(leftbordersum > maxleftbordersum) maxleftbordersum = leftbordersum; for(int j=center+1; j<=right; j++) { rightbordersum += a[j]; if(rightbordersum > maxrightbordersum) maxrightbordersum = rightbordersum; cari max jumlah dari tengah ke kiri return max3(maxleftsum, maxrightsum, maxleftbordersum + maxrightbodersum); cari max jumlah dari tengah ke kanan pilih max dari ketiga kemungkinan 04-Mar-04 IKI10100 - PM 5 First Half Second Half 4-3 5-2 -1 2 6-2 4 0 3-2 - 7 5 maxseqsum 04-Mar-04 IKI10100 - PM 6 Recursive Call Running Time Binary Search O ( log ) 04-Mar-04 IKI10100 - PM 7 low high mid int binsearch(data[ ], n, low, high) { mid = data.length() / 2; if( data[mid] == n ) return mid; else if ( n < data[mid] ) return binsearch(data[ ], n, low, mid ); else return binsearch( data[ ], n, mid+1, high); 04-Mar-04 IKI10100 - PM 8
Running Time of BinarySearch Tower of Hanoi (Lucas, 1883) Pindahkan tumpukan disc dari source ke dest dengan bantuan auxiliary Tumpukan disc harus mengecil ke atas. O (log ) 04-Mar-04 IKI10100 - PM 9 source auxiliary destination 04-Mar-04 IKI10100 - PM 10 Tower of Hanoi Recursive Solution ( discs) Change-making Problem: 1. Move the top -1 disks from Src to Aux (using Dst as an intermediary peg) 2. Move the bottom disks from Src to Dst 3. Move -1 disks from Aux to Dst (using Src as an intermediary peg) Solve(, Src, Aux, Dst) if is 0 exit Solve(-1, Src, Dst, Aux) Move from Src to Dst Solve(-1, Aux, Src, Dst) 04-Mar-04 IKI10100 - PM 11 Dengan coin yang tersedia C 1, C 2,.., C (cents) tentukan jumlah minimum coin yang diperlukan untuk kembalian sejumlah K cents. 04-Mar-04 IKI10100 - PM 12
Greedy Algorithm Inefficient makechange Dengan divide-and-conquer, hasilkan penyelesaian terbaik untuk setiap sub-problem tanpa memperhitungkan hasil akhir. Dengan coin: 1, 5, 10, 21 dan 25 cent, kembalian 63 cent: 25, 25, 10, 1, 1, 1. 04-Mar-04 IKI10100 - PM 13 int makechange (int[] coins, int change, int differentcoins) { int mincoins = change; max # of coins for (int i=0; i<differentcoins; i++) if (coins[i] == change) return 1; ada coin yg = change for (int j=1; j<=change/2; j++) { int thiscoins = makechange(coins, j, differentcoins) + makechange(coins, change-j, differentcoins); if(thiscoins < mincoins) mincoins = thiscoins return mincoins; 04-Mar-04 IKI10100 - PM 14 Brute-Force Recursive Version Dynamic Programming Coin = 1, 5, 7 Change = 10 1+minCoin(9) 1+minCoin(8) 5+minCoin(4) 7+minCoin(2) 1+minCoin(4) Hasil perhitungan disimpan dalam cache untuk kemudian dipakai lagi untuk permasalah yang sama. mincoin(10) 5+minCoin(5) 5+minCoin(0) 1+minCoin(2) 7+minCoin(3) 04-Mar-04 IKI10100 - PM 15 04-Mar-04 IKI10100 - PM 16
Dynamic Programming Result Caching Pelajari algoritma ini dan ubah ke bentuk recursive! for loop Version Menyimpan hasil penyelesaian optimal setiap tahap ke dalam bentuk array/tabel. Kembalian Jml Coin 2 2 5 1 6 2 10 1 11 2 23 3 63 3 04-Mar-04 IKI10100 - PM 17 coinused[0]=0; lastcoin[0]=1; for(int cents = 1; cents <= change; cents++) { int mincoins = cents; int newcoin = 1; for(int j = 0; j < diffcoins; j++) { j = index coin if(coins[ j ] > cents) continue; // can t use coin j if(coinused[ cents - coins[ j ] ] + 1 < mincoins) { mincoins = coinused[ cents-coins[ j ] ] + 1; newcoin = coins[ j ]; coinused[ cents ]=mincoins; lastcoin[ cents ]=newcoin; 04-Mar-04 IKI10100 - PM 18 Reporting Coin List for (int i = change; i > 0; ) { System.out.print( lastcoin[ i ] + ); i -= lastcoin[ i ]; System.out.println( ); 04-Mar-04 IKI10100 - PM 19 Result Caching Menyimpan hasil penyelesaian optimal setiap tahap ke dalam bentuk array/tabel. Kembalian Jml Coin 0 0 5 1 12 1 25 1 37 2 38 3 Kembalian Last Coin 0 0 5 5 12 12 25 25 37 12 38 1 coinused[ ] lastcoin[ ] Change(38) 04-Mar-04 IKI10100 - PM 20