(dapat berupa function atau procedure) yang memanggil dirinya sendiri • Program rekursi untuk beberapa kasus merupakan algoritma yang baik dan dapat membuat pemecahan masalah lebih mudah. Akan tetapi sebagai imbalannya, proses ini harus dibayar mahal dg memori yg banyak digunakan, karena setiap kali subprogram dipanggil, maka diperlukan sejumlah memori. • Hal yg perlu diperhatikan dlm menulis suatu function atau procedure rekursi:
function atau procedure tsb harus
mengandung suatu kondisi akhir dari proses rekursi. kondisi ini diperlukan untuk mencegah terjadinya proses rekursi yg tiada henti (indefinite) • Contoh proses rekursi yg tidak pernah berakhir Procedure rekursi; begin write(‘pascal ’); rekursi; end; begin rekursi; end. Untuk mengakhiri proses rekursi ini, harus ditekan ctrl-c atau ctrl-break • Kondisi pengakhiran rekursi dapat dilakukan dengan menggunakan statement penyeleksian kondisi var akhir:byte; procedure rekursi; begin if akhir < 4 then begin write(‘pascal ‘); akhir:=akhir+1; rekursi; end; pascal pascal pascal pascal end; begin akhir:=0; rekursi; end. procedure deret(N: byte); begin write(N:3); if N < 8 then deret(N+1); end; var N: byte; begin 0 1 2 3 4 5 6 7 8 N:=0; deret(N); end. Program Faktorial • Faktorial adalah 1x2x3x….xN (dengan asumsi N > 3) N! = N * (N-1) * (N-2)*…..*1 Perumusan scr rekursi sbb: N!=N*(N-1)! Procedure faktorial(N:byte; var hasil:longint); Begin if N<=1 then hasil:=1 else begin faktorial(N-1,hasil); hasil:=N*hasil; end; End; Var N : byte; F:longint; Begin write('berapa faktorial?');readln(N); faktorial(N,f); writeln(N,' faktorial=',f); readln; End. Function faktorial(N:byte):longint; Begin if N<=1 then faktorial :=1 else faktorial:=N*faktorial(N-1); End; Var n:byte; Begin write(‘berapa faktorial’);readln(N); writeln(n,’faktorial =‘,faktorial(N) ); End. • Perkalian 2 nilai posifif bulat A*B=A untuk B=1 A * B = A + A *(B-1) untuk B>1 contoh : 5*3=5+5*2 5*3=5+5+5*1 5*3=5+5+5 Function kaliposbulat(A,B :word):word; Begin if B=1 then kaliposbulat:=A else kaliposbulat:=A+kaliposbulat(A,B-1) end; Var nilai1,nilai2:word; Begin write(‘nilai pertama ?’);readln(nilai1); write(‘nilai kedua ?’);readln(nilai2); writeln(nilai1,’x’,nilai2,’=‘ ,kaliposbulat(nilai1,nilai2)); End. Kelemahan Rekursi • Untuk kasus tertentu, rekursi mempnyai kelemahan yaitu proses yang sudah dilakukan akan diproses ulang kembali, shg akan membuat proses mjd lama. • Contoh : deret fibonacci fibonacci(N)=N ;untuk N<2 fibonacci(N)= fibonacci(N-2)+ fibonacci(N-1) ;untuk N>=2 function fibonacci(N:word):word; begin if N<2 then fibonacci :=N else fibonacci:=fibonacci(N-2)+ fibonacci(N-1) ; end; var N:word; begin write(‘suku ke berapa?’);readln(N); writeln(‘nilai suku ke ‘, N, ‘adalah’,fibonacci(N)); end. • Dari proses rekursi, untuk menghitung suku ke-6 dilakukan tahapan sbb: • fibonacci(6) = fibonacci(4)+ fibonacci(5) =fibonacci(2)+ fibonacci(3)+fibonacci(5) =fibonacci(0)+ fibonacci(1)+fibonacci(3)+ fibonacci(5) =……. Dst Tampak bahwa tiap2 proses rekursi memanggil dirinya sendiri sebanyak 2x • Penggunaan iterasi/perulangan lebih efisien jika dibandingkan dg rekursi Function fibonacci(N:word):word; var fibobawah, fiboatas, x, i : word; begin if N<2 then fibonacci:=N else begin fibobawah:=0; fiboatas:=1; for i:=2 to N do begin x:=fibobawah; fibobawah:=fiboatas; fiboatas:=x+fibobawah; end; fibonacci:=fiboatas; end; end; var N :word; begin writeln(‘suku ke berapa?’); readln(N); writeln(‘nilai suku ke’,N,’adalah ‘, fibonacci(N)); end.