27
Rekursi iharapkan Anda mampu memahami penggunaan rekursi. Beberapa contoh sengaja diberikan dengan harapan Anda bisa menerapkannya pada persoaalan-persoalan yang lain. Peng€nalan Rekursi Contoh Persoalan-persoalan ReL:ursi

Bab-09

Embed Size (px)

DESCRIPTION

C Language 01 05

Citation preview

  • Rekursi

    iharapkan Anda mampu memahami penggunaan rekursi.Beberapa contoh sengaja diberikan dengan harapanAnda bisa menerapkannya pada persoaalan-persoalanyang lain.

    Pengnalan RekursiContoh Persoalan-persoalan ReL:ursi

  • 356 Algotitma Pemrcgrcman Menggunakan C ++

    9.1 Pengenalan RekursiRekursi adalah suatu kemampuan subrutin Lmtuk memanggil

    dirinya sendi . Adapun suatu subrutin yang memanggil dirinya seperti itudinamakan subrutin iekursif. Pada beberapa persoalan, kenumpuanseperti itu sangat berguna karena mempetmudah solusi. Namun demikianrekursi juga memiliki kelemahan, yakni memungkinkan tedadinyaoveilow pada stack (stdck tidak lagi mampu menangani permintaanpemanggilan subrutin karena kehabisan memoi). Itulah sebabnya harusada jaminan bahwa proses rekursi akan berhenti pada suatu waktuteftentu, yang menyebabkan pemanggilan lungsi berakiir.

    e @to'f 6rn Slack adalah area memori yanglokal dan untuk mengalokasikanfungsidipanggil.

    dipakai untuk variabelmemo ketika suatu

    Persoalan rekusi biasa di.jumpai pada matematika. Sebagai contoh,proses rekrsi dapat digunakan untuk menghitung faktorial. Dalam hal inisuatu laktorial ml didefinisikan sebagai berikut:

    l,jikan=0otoun=1

    m x (m-l)l,liko rn ) 0Gambar 9.1 Fnktarial pada matenatika

    Gambar 9.2 Memperlihatkan proses pemerolehan hasil 4!,

    ml

  • 357

    foldcio(4)

    4 * fokto.iql(3)

    3 r foldorl{2)

    2 r folaoriol(l)

    foktorial(l)

    {F) Hs a".n2,

    Gambsl 9.2 Ganbarun rekursi

    9.2 Contoh Persoalan-persoalan Rekursi

    Gontoh 9.1 rutistan algoritma untuk menyelesaikan faktorialseperti yang dipaparkan pada Gambar 9.1 Tuangkan pula ke dalamprogram.

    Algoritmrl

    SUBRUTIN/d/.rordl(n)JIKAn=0ATAU I MAKA

    MLAI-BALIK 1SEBALIKNYA

    NILAI-BALIK n xfaktorial( l)AKHIR-JIKA

    AKHIR-SUBRUTIN

    Program:Implementasi dalam program C:

  • *incluale loDg int faktorial (unslgned int n)(

    if (n == 0 ll !1 =- 1)retutn li

    claereturE n * fah!oria1(n-1) ;

    )intt

    nain ( )

    in! a;long ln! haall,printf ('rr = r),Ecanf ( rtal', &n) ,ha8il = faktoliaL (n) tpllntf(.tatt

    - tlat', n, ba8tl);relurll 0t

    Contoh pcngelsclosian program:

    gc>faktJ

    Gttur93 Hatil prpgrnt talrodal

  • R9k/r, 3i9

    Lrylorctrhsi d&lan progrrm C+i:

    *iDclude lons int faktorial {uhslo|ned Int n)(

    if {n == 0 ll r -= 1)return 1;

    el,Beletsurn n i faktorial (n-1) ;

    )1nt ualn ( )(

    iat n;Long int hasilicout

  • 3@ AEonIma pemrcgtaman Monggunakan C ++Contoh hubungan antara n dan hasil fungsi:

    n fib(n)001l2t32435568713:11

    Gambar 9.4 memperlihatkan proses pemanggitan fib(6).

    fib(l) + fib(o)

    Eb(l) + 6b(o)

    fib(r) + trb(o)

    cambar 9.4 proses pada penangsilanf(6)

    Tuangkaniah dalam bentuk algorifnra maupun progfin.

  • RekuA'i 361

    Algoritma:

    SUBRUTINI6(r)JIKA n: O MAKA

    NILAI-BALIK OSEBALIKNYA

    JIKAn=1MAKANILAI-BALIK 1

    SEBALIKNYANILAI-BALIK/ib(n- I ) +Jib(n-2)

    AKHIR.JIKAAKHIR-JIKA

    AKHIR.SUBRUTIN

    Program:Implementasi dalam program C:

    E Kode suhber c : lib.cliinclude lons inr fib(unsisned int n){ if (n == 0)

    return 0;if (n == 1)

    return fib (n-1) + fib(n-2);)irl nain ( ){

    1on9 inr hasif;prinlf("n = ");scanf ('gd" , &n) ;hasil = fib(n);

  • 362 Atgofilma p1mtqrcfian Menggunakan C ++

    -

    Printf('fib(td) = CId', n. hasil);return 0;

    Contoh pengeksekusian progam:

    rogc>fibJ

    c: \progc>

    ca,'rb,J 9.5 Hasit prcsan fb

    Implernentasi dalam program C+:

    *irlclude lons int fib(unsigned int n){ if (n == 0)

    relurn 0;else

    if (n =- 1)return 1;

    elsereturn fib (n-1) + fib(n_2),

    I

    inl nain( )t

    long i:rts hasil;couc

  • fib (n) ;'fibi"
  • 364 Algorilma Pemtughman Mencgunakan C ++

    Tuangkan dalam bentuk algoritma maupun progmm.

    Algoritma:

    SUBRUTIN pangtar(y,,r)JIKAn=IMAKA

    NILAI-BALIK ySEBALIKNYA

    NILAI-BAIIK y xpa gkat(y, n-l)AKHIR-JIKA

    AK}tIR-SUBRUTINProgrrm:Implementasi dalam program C:

    Kode Sunber C :

    liinclude long inr pangkat { unsigred int y, unsiqned int n)t if (n == 1)

    relurn y;else

    reEurn y' pangkat(y, n-1);)

    inl main{ )t

    long in! hasil)printf { 'Menghitung y pangkat n\n" );scanf ('*d", &y) ;piintf("n = ");scanf ( ,,gd' , &n) ;

  • Rekurci 365

    hasil = pangkat {y, n);prinlf('td^td = tld". y, n, hasil);return 0;

    Contoh pngeksekusian progam:

    G^nb^r 9.1 Hasil progran pangkat

    Irnplementasi dalam progam C++:

    *include LoDg int pangkat (unsigned int y. unsigned inL n)(

    )int rnain o{

    lnts y. n;lons int hasil;

    pangkat (y, n-1),

  • Algoilma Pemrogtaman Menggunakan C ++

    cou!

  • Rekutsi 367

    *include void balik{1ons int bil){

    long int digritTersi saDiKiri;printf ( "tdi, bil t 10) ;digrit"ersisaDiKiri = bil / 10;if (disritTersisaDiKiri != 0)

    balik (digiETersisaDiKiri ) ;i

    t int bil;printf (ibilangan bulaE = ');scanf ('td", &bit),balik{bi1) t

    ]

    Contoh pengekrekusian proglam:

    234567A9)c: \progc>

    Gatu^r 93 Hasil program balik

    Implementasi dalam prog-mm C+:

  • *include void balik(lons int bil )(

    long inr digitTersi saDiKirt ;coui: bil;balik(bi1);

    ]

    GOntOh -

    9.5 L adalah larik yang be.isi n buah elemm Buatlahsubrutin maks (L, n, k) yang akan menghasilkan bilangan terbesarpada k elemen pertama dalam larik L Kerjakan dengan pendekatanrelrrsi. Contoh, bil L berisi

    [5,6,3, 5,8,3]

    Subrutin maks(L,6,4) mencari bilangan terbesar dari elemen-elemen 5. 6,3, 5 (sebanyak 4 buah elenren).

    Algoritma:Algoritma berikut mengasumsikan bahwa I1 > 0 dengan indeks larikdimulai dari nol:

  • Rekursl 369

    SUBRITTIN n a&s(r, a &)JIKAk>nMAKA

    k-nAKHIR-JIKAJIKA k= I MAKA

    NILAI-BALIK L[O]SEBAIIK}ryA

    JIKA K > 1 MAKAIIKA Llk-l'l> naks(L, n, k-1) MAKA

    NILAI-BALIK L[K-I]SEBALIKNYA

    }.IILAI-BALIJ(, maks(L, n, k-1)AKHIR.JIKA

    SEBALIKNYA// Berarti k < INILAI-BALIK -32768

    AKHIR.JIKAAKHIR-JIKA

    AKHIR.SUBRIJTIN

    Pada algorihna di atas, bila nilai k < l, indeks akan diberi nilai berupa -32768.

    Progrem:Implementasi dalam progmm C:

    *include inc maks (int datall, inr n, inr k)(

    if{k>n}if {k==1)

    retsurn dalai0l;if (k > 1)

  • 370 Algoritma Pemrcgrcman Menggunakan C ++

    if (daEalk-11 > maks(datsa, n, k-1))return data Ik-1] ,relurn naks ldala,

    else /* Berarli k < 1return -32768;

    n. k-l);

    )int(

    = tI, 4, 6, 2, 8,'td\n,,, maks (L, 9,'td\n', maks (L, 9,"td\nr, maks (L, 9,0;

    nain( )int r,tlprintsfprintfprintf

    2, 4, 3l i5,2)4j9)

    Contoh pengeksekusian program:

    progc>

    G^mbtr 9.9 Hdsil Ptogam na$ektImplementasi dalam progam Cs:

    J+include

    int maks(ints dalaf], int n, inl k)

  • 371

    if (k>n)

    if {k==1)return datal0l;

    efseif{k>1}

    if (daEalk-11 > naks (data, n, k-1))return data [k-1] ;return maks (data,

    else /* Berarti k < 1reEurn -32768;

    nainoint Ltl = {1, 4,couE

  • 372 Algoitma Pomrograman Menggunakan C ++

    Algoritma:

    SUBRUTIN dctel(r'l, ,)JIKAm=0MAKA

    NILAI-BALIK n+lSEBALIKNYA//mr0

    JIKAn=0MAKANILAI-B A'l-lK acker( - 1, l )

    SEBALIKNYANILAI-BALIK acket(n- 1, acker(n, n- I ))

    AKHTR-JIK AAKHIR.JIKA

    AKHIR-SUBRUTIN

    Program:Implementasi dalam program C:

    #include long int acker(int m, int n){ if (n' == 0)

    relurn n+1;if (n == 0)

    rerurn acker (n-1, 1),else /* Berarli m 0 dan n 0 */

    return acker (m-1, acker(m,n-1) );]int main ( ){ prinlf (" t]d\n ", ackeri0,5)printf (" tld\n ", acker(1,0)prinlf (" 9]d\n ", acker(3, 1)

  • Rekutsi

    Contoh pengksekusian progam:

    c>ackerJ

    c: \progc>

    Gembar 9.10 Hasil program acker

    Implementasi dalam prog*Lm C#:

    *include long lnt acker(inr m. int n)(

    if {m == 0)IEEUITT N+1;

    if {n == 0)retsurn acker{m-1, 1);

    else /* Berarti n 0 alan n 0 */reEurn acker (rn-1, acker (In, n-1) ) ;

    I

    {

  • 374 Algoilma Pemrcgraman Mengqunakan C ++

    cout

  • Reku'si

    Program:Implementasi dalam program C:

    *inctude int binom(inE n, int k)(

    if (k == 0)return 1;if lk == n)

    reluxn 1;reluin binon(n-1, k-1)

    )inE main( )(

    prinEf ( "$1d\n', binom(1,1) ) ;prinlf ('81d\ni. binon(5, 3) ) ;

    + binom(n-l, k);

    Contoh pengeksekusian Fogram:

    progc>

    Gsmbar 9.11 Hasil progam bino

  • 376 Algoritma Pemrogrcman Menggunakan C ++

    Implementasi dalam program C++:

    Lg r"U" s"^u"" c-. ,tl Lp,__i inc.ude < iosLream.h>inl binomiint n, int k)t if (k == 0)

    relurn 1;if (k == n)

    return 1;reiurn binon(n-1,

    )

    int n\ain ( ){

    cout

  • 377

    I:iiii-----------iti

    I -"-- --' --------'t

    B cGsmbaf 9.12 A,bonth nrc"nK hanoi. Pc\tinturlta s.ia h* pn.i,t8 dffi sunt

    k tggnl kc to agdk)tu'glai

    Penindahan piring dilakukan dengan kctcnluan scbagai berikut:I . Setiap saat hanya satu piring yang boleh dipindah.2. Ketika sebuah piring dipindahkan. piring tersebut hanya dapilt

    dilelakkan pada salah satu dari ketiga tonggak.3. Sctiap piring harus diletakkan di atas piring yang ukurannya lebih

    bcsar.

    Penyclcsaian secam rekursifuntuk persoalan ini untuk n buah piring:1. Pindahkan n-l piring teratas pada tonggak A ke tonggak B.

    dengan menggunakan longgak C scbagai pemntara.2. Pindahkan 1 piring tersisa pada tonggak A ke tonggak C.3- Pindahkan n-l piring teratas pada longgak B ke longgak C,

    dengan ftenggunakan longgak A sebagai pcmntara.

    Algoritme: .SUBRUTIN l|'atoi{,r, ll, ,, c)

    JIKAn=IMAKAtampilkan("Memindah piring dari". a. " ke ". c)

    SEBALIKNYA// Memindah n-l piring dari a ke b, dcngan c sebagai

    pemnlam

  • 378 Algorilma Pemrograman Menggunakan C ++

    ha oi(11-1, a, c, b)// Menindah I piring tersisa dari a ke chanol(1, a, b. c)// Memindah n-l dari b ke c, dengan a sebagai pemntarahanoi(n- I , b, a, c)

    AKHIR-JIKAAl(HlR-SUBRUTIN

    Program:lmplementasi dalam prcgmm C:

    KodesuhberC:hanoi.c+include

    void hanoi(inl n, char a, char b, char c){

    if (n == 1)prinrf ("Pindahkan piringr dari tc ke tc\n", a,

    thanoi (n-1, a, c, b);hanoi (1, a, b, c);hanoi (n-1, b, a, c);

    )

    in! jumJirins;printf { "Jum1ah pirins: ");scanf ("*d", & jm--pir.ins) ,hanoi (jumJiring, 'A', 'B', 'c');

    1

    {

    Akhir Kode Sulnber.

  • 379

    Contoh pengeksekusian Ptogmm:

    ro gc >ha-noiJ

    c:\progc>

    Grnt,bar 9.13 Hasil Ptogan Hanoi

    Impledentasi dalam Program C#:

    *include void hanoi (inl n, char a.{

    if {n == 1)cout

  • 380 Algotitna Pemrcgtaman Menggunakan C ++

  • Jarvab:

    Saya sependapat dcngan Anda. Contoh. seperri maks0 di dcPan lcbihsingkat bila dilangani dengan ilerasi.

    9.4 Soall- fddapat ruDlusan scperti bcrikul:

    f(n) = 1un'uUn=Of(n) = 2 f(n-l) unt'rk n > 0Menurul Anda , berapakah hasil li4)?Tuangkanlah rumusan di atas dalarrr bcntuk algoritma dan progranl,

    2. FI'B (faktor pcrsekutuan te6esar. yang dibahcs pada Bab 3) dapatdiselesaikan secara rckursifdengan cat? scpcrti be kut:

    fpb(x. y): yjika y: x dan sisajcmbagian(x. y) = 0fpb(x. y)

    - Ipb(y, x) jika x < y

    fpb(x,y) : fpb(y. sisajembagiarr(x. y)) untuk keadaan yang lain

    Cobalah menuangkannya dalanr bcntuk algoritna. Implemcntasikanpula programnya.

    3. Subrulin komite(n. k) digunakan Lrntuk merrcntukan jurnlahkcmungkinxn komite yang terdiri dari k orang yang dipililr dari noranS yang terscdia. Contoh. kornile(4.3) mcnghasilkan 4kemungkinan. Taruhlah keenlpat orang tersebut adalah A, B. C. danD, maka kemungkinan pasangan keempal orang untuk membenlukkomite yang terdiri aras 3 orang bisa bcrupa ABC, ABD. ACD. danBCD. Subrutin lerscbut dapat diluanSkan nrcnurut rumusan scpertiberikut:

    kornitc(n, k) = komitc(n-I. k) + komitc(n-l. k-l) unruk n. ki ICobalah bentuk algoritma beserto programnya.

    381