11
1 Struktur Data & Algoritme (Data Structures & Algorithms) Denny ([email protected] ) Suryana Setiawan ([email protected] ) Fakultas Ilmu Komputer Universitas Indonesia Semester Genap - 2004/2005 Version 2.0 - Internal Use Only Recursion SDA/TOPIC/V2.0/2 Objectives Memahami lebih dalam method rekursif Dapat membuktikan bahwa sebuah method rekursif sudah benar dengan menggunakan induksi matematik

Struktur Data & Algoritme - aren.cs.ui.ac.idaren.cs.ui.ac.id/sda/archive/2005/slides/06-Recursive-2pp.pdf · 3 SDA/TOPIC/V2.0/5 Method/Fungsi Recursion Fungsi yang memanggil dirinya,

Embed Size (px)

Citation preview

Page 1: Struktur Data & Algoritme - aren.cs.ui.ac.idaren.cs.ui.ac.id/sda/archive/2005/slides/06-Recursive-2pp.pdf · 3 SDA/TOPIC/V2.0/5 Method/Fungsi Recursion Fungsi yang memanggil dirinya,

1

Struktur Data & Algoritme(Data Structures & Algorithms)

Denny ([email protected])Suryana Setiawan ([email protected])

Fakultas Ilmu KomputerUniversitas Indonesia

Semester Genap - 2004/2005Version 2.0 - Internal Use Only

Recursion

SDA/TOPIC/V2.0/2

ObjectivesMemahami lebih dalam method rekursifDapat membuktikan bahwa sebuah method rekursifsudah benar dengan menggunakan induksimatematik

Page 2: Struktur Data & Algoritme - aren.cs.ui.ac.idaren.cs.ui.ac.id/sda/archive/2005/slides/06-Recursive-2pp.pdf · 3 SDA/TOPIC/V2.0/5 Method/Fungsi Recursion Fungsi yang memanggil dirinya,

2

SDA/TOPIC/V2.0/3

OutlineApa itu recusion/rekursif?Recursion rulesInduksi Matematik

SDA/TOPIC/V2.0/4

Apa itu Recursion?Method yang memanggil dirinya sendiri baik secaralangsung maupun secara tidak langsung.

f(0) = 0; f(x) = 2 f(x-1) + x2

• f(1) = 1; f(2) = 6; f(3) = 21; f(4) = 58fib(n) = fib(n - 1) + fib(n - 2)

public static int f (int x) {

if (x == 0) return 0;return 2 * f (x - 1) + x * x;

}

Page 3: Struktur Data & Algoritme - aren.cs.ui.ac.idaren.cs.ui.ac.id/sda/archive/2005/slides/06-Recursive-2pp.pdf · 3 SDA/TOPIC/V2.0/5 Method/Fungsi Recursion Fungsi yang memanggil dirinya,

3

SDA/TOPIC/V2.0/5

Method/Fungsi RecursionFungsi yang memanggil dirinya, secara langsungatau lewat fungsi lain, disebut fungsi rekursifProses pemanggilan diri itu disebut rekursi(recursion).Contoh:

Memangkatkan bilangan real tak nol dengan suatupangkat bilangan bulat

⎪⎪⎩

⎪⎪⎨

<

>∗

=

=

010

011

njikax

njikaxx

njika

x

n

nn

SDA/TOPIC/V2.0/6

/**Menghitung pangkat sebuah bilangan real(versi rekursif).@param x bilangan yang dipangkatkan (x != 0)@param n pangkatnya

*/public staticdouble pangkatRekursif (double x, int n) {

if (n == 0) {return 1.0;

} else if (n > 0) {return (x * pangkatRekursif (x, n - 1));

} else {return (1 / pangkatRekursif (x, -n));

}}

Page 4: Struktur Data & Algoritme - aren.cs.ui.ac.idaren.cs.ui.ac.id/sda/archive/2005/slides/06-Recursive-2pp.pdf · 3 SDA/TOPIC/V2.0/5 Method/Fungsi Recursion Fungsi yang memanggil dirinya,

4

SDA/TOPIC/V2.0/7

Berapa nilai pangkat 4-2?

pangkatRekursif (4.0, 2)return (4.0 * pangkatRekursif (4.0, 1));

pangkatRekursif (4.0, 1)return (4.0 * pangkatRekursif (4.0, 0));

pangkatRekursif (4.0, 0)return 1.0;

Recu

rsiv

e c

all

s

1.0

4.0

16.0

0.0625

Retu

rnin

g v

alu

es

pangkatRekursif (4.0, -2)return (1 / pangkatRekursif (4.0, 2));

SDA/TOPIC/V2.0/8

Algoritme RekursifCiri masalah yang dapat diselesaikan secara rekursifadalah masalah itu dapat di-reduksi menjadi satuatau lebih masalah-masalah serupa yang lebih kecilSecara umum, algoritme rekursif selalu mengandungdua macam kasus:

kasus induksi: satu atau lebih kasus yang pemecahanmasalahnya dilakukan dengan menyelesaikan masalahserupa yang lebih sederhana (yaitu menggunakan recursive calls)kasus dasar atau kasus penyetop: satu atau lebih kasusyang sudah sederhana sehingga pemecahan masalahnyatidak perlu lagi menggunakan recursive-calls.

Supaya tidak terjadi rekursi yang tak berhingga, setiap langkah rekursif haruslah mengarah ke kasuspenyetop.

Page 5: Struktur Data & Algoritme - aren.cs.ui.ac.idaren.cs.ui.ac.id/sda/archive/2005/slides/06-Recursive-2pp.pdf · 3 SDA/TOPIC/V2.0/5 Method/Fungsi Recursion Fungsi yang memanggil dirinya,

5

SDA/TOPIC/V2.0/9

Recursion RulesPunya kasus dasar

Kasus yang sangat sederhana yang dapat memprosesinput tanpa perlu melakukan rekursif (memanggilmethod) lagi

Rekursif mengarah ke kasus dasarPada proses pemanggilan rekursif, asumsikan bahwapemanggilan rekursif (untuk problem yang lebihkecil) adalah benar.

Contoh: pangkatRekursif (x, n)• Asumsikan: pangkatRekursif (x, n - 1)

menghasilkan nilai yang benar.• Nilai tersebut harus diapakan sehingga menghasilkan

nilai pangkatRekursif (x, n) yang benar?• Jawabannya: dikalikan dengan x

SDA/TOPIC/V2.0/10

Infinite Recursionpublic static int bad (int n) {

if (n == 0) return 0;return bad (n * 3 - 1) + n - 1;

}

Page 6: Struktur Data & Algoritme - aren.cs.ui.ac.idaren.cs.ui.ac.id/sda/archive/2005/slides/06-Recursive-2pp.pdf · 3 SDA/TOPIC/V2.0/5 Method/Fungsi Recursion Fungsi yang memanggil dirinya,

6

SDA/TOPIC/V2.0/11

How it works?Java VM menggunakan internal stack of activation recordsActivation record dapat dilihat sebagai kertas yang berisi informasi tentang method

nilai parametervariabel lokalprogram counter (PC)

SDA/TOPIC/V2.0/12

How it works?Ketika suatu method G dipanggil, sebuah activation record untuk G dibuat dan di-push ke dalam stack; saat ini G adalah method yang sedang aktifKetika method G selesai (return), stack di-pop; method dibawah G yang dipanggil.

Page 7: Struktur Data & Algoritme - aren.cs.ui.ac.idaren.cs.ui.ac.id/sda/archive/2005/slides/06-Recursive-2pp.pdf · 3 SDA/TOPIC/V2.0/5 Method/Fungsi Recursion Fungsi yang memanggil dirinya,

7

SDA/TOPIC/V2.0/13

Too Much Recursionpublic static long s (int n) {

if (n == 1) {return 1;

} else {return s (n - 1) + n;

}}

Di sebuah system, n >= 9410 tidak dapat dieksekusi

SDA/TOPIC/V2.0/14

Pembuktian dgn InduksiContoh kasus: pangkatRekursif (x,n)

Buktikan bahwa base case benar.pangkatRekursif (x,0) = 1

Buktikan bahwa inductive case benarsmaller instances of the same problem may be assumed to work correctly.• asumsikan bahwa pangkatRekursif (x, n-1)

memberikan nilai xn-1

apakah pangkatRekursif (x, n) mengembalikannilai yang benar?• pangkatRekursif (x, n) = pangkatRekursif (x, n-1) * x

• xn = xn-1 * x

Page 8: Struktur Data & Algoritme - aren.cs.ui.ac.idaren.cs.ui.ac.id/sda/archive/2005/slides/06-Recursive-2pp.pdf · 3 SDA/TOPIC/V2.0/5 Method/Fungsi Recursion Fungsi yang memanggil dirinya,

8

SDA/TOPIC/V2.0/15

Fibonacci numbersF0 = 0, F1 = 1, FN = FN-1 + FN-2

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

public static int fib1 (int n){

if (n <= 1) return n;return fib1 (n – 1) + fib1 (n – 2);

}

SDA/TOPIC/V2.0/16

Fibonacci numbersFor N = 40, FN takes over 300 million recursive calls. F40 = 102.334.155

Growth rate: exponential!!!Rule: never duplicate work by solving the same instance of a problem in separate recursive calls.

Ide: simpan nilai fibonacci yang sudah dihitungdalam sebuah array

Page 9: Struktur Data & Algoritme - aren.cs.ui.ac.idaren.cs.ui.ac.id/sda/archive/2005/slides/06-Recursive-2pp.pdf · 3 SDA/TOPIC/V2.0/5 Method/Fungsi Recursion Fungsi yang memanggil dirinya,

9

SDA/TOPIC/V2.0/17

Fibonacci numbers

public static int fib2 (int n){

if (n <= 1) return n;int result[] = new int[n + 1];result[0] = 0;result[1] = 1;for (int ii = 2; ii <= n; ii++) {

result[ii] = result[ii - 2] + result[ii - 1];

}return result[n];

}

Dynamic Programming solves sub-problems nonrecursively by recording answers in a table

SDA/TOPIC/V2.0/18

Fibonacci numbers

public static int fib3 (int n){

if (n <= 1) return n;

int fib1 = 0;int fib2 = 1;int result;for (int ii = 2; ii <= n; ii++) {

result = fib2 + fib1;fib1 = fib2;fib2 = result;

}return result;

}

Page 10: Struktur Data & Algoritme - aren.cs.ui.ac.idaren.cs.ui.ac.id/sda/archive/2005/slides/06-Recursive-2pp.pdf · 3 SDA/TOPIC/V2.0/5 Method/Fungsi Recursion Fungsi yang memanggil dirinya,

10

SDA/TOPIC/V2.0/19

Kesalahan UmumBase case terlalu kompleksProgress tidak menuju base caseAturan tambahan:

hindari duplikasi proses untuk nilai input yang sama dalam recursive call yang terpisah.

SDA/TOPIC/V2.0/20

SummaryMethod rekursif adalah method yang memanggildirinya sendiri baik secara langsung maupun secaratidak langsung.Recursion rules

Have a base case: yang dapat memproses input tanpaperlu recursive lagiMake progress to the base caseAlways assume that the recursive call worksnever duplicate work by solving the same instance of a problem in separate recursive calls.

Page 11: Struktur Data & Algoritme - aren.cs.ui.ac.idaren.cs.ui.ac.id/sda/archive/2005/slides/06-Recursive-2pp.pdf · 3 SDA/TOPIC/V2.0/5 Method/Fungsi Recursion Fungsi yang memanggil dirinya,

11

SDA/TOPIC/V2.0/21

Further ReadingChapter 7

SDA/TOPIC/V2.0/22

What’s NextData Structure - Chapter 6