Anda di halaman 1dari 15

REKURSI

• Rekursi adalah proses dari suatu subprogram


(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.

Anda mungkin juga menyukai