• Tidak ada hasil yang ditemukan

2. memanggil fungsi secara recursive untuk setiap bagian

N/A
N/A
Protected

Academic year: 2023

Membagikan "2. memanggil fungsi secara recursive untuk setiap bagian"

Copied!
5
0
0

Teks penuh

(1)

04-Mar-04 IKI10100 - PM 1

Recursion Properties

z

base case, problem paling sederhana yang memproses input tanpa perlu recursive lagi.

z

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 2

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 3

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

Pilih dari ketiganya yang menghasilkan nilai terbesar.

MaxSubseqSum

Case 1 Case 2

Case 3

04-Mar-04 IKI10100 - PM 4

Recursive version

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;

if(left == right)

return a[left] > 0 ? a[left] : 0;

int maxLeftSum = maxSumRec(a, left, center);

int maxRightSum = maxSumRec(a, center+1, right);

….

MaxSubseqSum

cari index tengah base case

cari max di paruh kiri

cari max di paruh kanan

(2)

04-Mar-04 IKI10100 - PM 5

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;

}

return max3(maxLeftSum, maxRightSum,

maxLeftBorderSum + maxRightBoderSum);

}

MaxSubseqSum

pilih max dari ketiga kemungkinan cari max jumlah dari tengah ke kiri

cari max jumlah dari tengah ke kanan

04-Mar-04 IKI10100 - PM 6

Recursive Version

4 -3 5 -2 -1 2 6 -2

First Half Second Half

-1 1 7 5 4 0 3 -2

maxSeqSum

Running Time

N N N N O (N log N)

Recursive Call

Binary Search

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);

(3)

04-Mar-04 IKI10100 - PM 9

Running Time of BinarySearch

O (log N)

04-Mar-04 IKI10100 - PM 10

Tower of Hanoi (Lucas, 1883)

z

Pindahkan tumpukan disc dari source ke dest dengan bantuan auxiliary

z

Tumpukan disc harus mengecil ke atas.

source auxiliary destination

04-Mar-04 IKI10100 - PM 11

Recursive Solution (N discs)

Tower of Hanoi

1. Move the top N-1 disks from Src to Aux (using Dst as an intermediary peg)

2. Move the bottom disks from Src to Dst

3. Move N-1 disks from Aux to Dst (using Src as an intermediary peg)

Solve(N, Src, Aux, Dst) if N is 0 exit

Solve(N-1, Src, Dst, Aux) Move from Src to Dst Solve(N-1, Aux, Src, Dst)

04-Mar-04 IKI10100 - PM 12

Change-making Problem:

z Dengan coin yang tersedia C 1 ,

C 2 , .., C N (cents) tentukan jumlah

minimum coin yang diperlukan

untuk “kembalian” sejumlah K

cents.

(4)

04-Mar-04 IKI10100 - PM 13

Greedy Algorithm

z Dengan divide-and-conquer, hasilkan penyelesaian terbaik untuk setiap sub-problem tanpa

memperhitungkan hasil akhir.

z Dengan coin: 1, 5, 10, 21 dan 25 cent, kembalian 63 cent: 25, 25, 10, 1, 1, 1.

04-Mar-04 IKI10100 - PM 14

Inefficient makeChange

int makeChange (int[] coins, int change, int differentCoins) { int minCoins = change;

for (int i=0; i<differentCoins; i++) if (coins[i] == change) return 1;

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;

}

max # of coins

ada coin yg = change

Brute-Force Recursive Version

Coin = 1, 5, 7 Change = 10

minCoin(10)

1+minCoin(9)

5+minCoin(5)

7+minCoin(3)

1+minCoin(8) 5+minCoin(4) 7+minCoin(2) 1+minCoin(4) 5+minCoin(0) X

1+minCoin(2) X

X

Dynamic Programming

z Hasil perhitungan disimpan dalam

cache untuk kemudian dipakai lagi

untuk permasalah yang sama.

(5)

04-Mar-04 IKI10100 - PM 17

Result Caching

z

Menyimpan hasil penyelesaian optimal setiap tahap ke dalam bentuk array/tabel.

Kembalian Jml Coin

1 1

2 2

. .

5 1

6 2

. .

10 1

11 2

23 3

63 3

Dynamic Programming

04-Mar-04 IKI10100 - PM 18

for loop Version

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++) {

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;

}

j = index coin Pelajari algoritma ini dan ubah ke bentuk recursive!

04-Mar-04 IKI10100 - PM 19

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 20

Result Caching

z

Menyimpan hasil penyelesaian optimal setiap tahap ke dalam bentuk array/tabel .

Kembalian Jml Coin

0 0

1 1

. .

5 1

.

12 1

25 1

.

37 2

38 3

Kembalian Last Coin

0 0

1 1

.

5 5

.

12 12

25 25

.

37 12

38 1

coinUsed[ ] lastCoin[ ] Change(38)

Referensi

Dokumen terkait