Upload
isnur-muhammad-suryo-margono
View
27
Download
5
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
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