Recursive Function
Recursive Function
recursive function
f(0) = 3
f(n + 1) = 2f(n) + 3
Maka
f(0) = 3
f(1) = 2f(0) + 3 = 23 + 3 = 9
f(2) = 2f(1) + 3 = 29 + 3 = 21
f(3) = 2f(2) + 3 = 221 + 3 = 45
f(4) = 2f(3) + 3 = 245 + 3 = 93
Fungsi Rekursif
return_data_type function_name(parameter_list){
...
function_name(...);
...
}
Problems
• Faktorial
5! = 5 x 4 x 3 x 2 x 1
4! = 4 x 3 x 2 x 1
Berarti 5! = 5 x 4!
• Metode Iteratif
Salah satu cara untuk menghitung adalah dengan
menggunakan loop, yang mengalikan masing-masing
bilangan dengan hasil sebelumnya. Penyelesaian dengan
cara ini dinamakan iteratif, yang mana secara umum
dapat didefinisikan sebagai berikut:
• n! = (n)(n-1)(n-2) … (1)
Program Iteratif
#include <stdio.h>
int fact_it (int n)
{
int i,fak;
/******************************************************
* Menghitung sebuah faktorial dengan proses looping *
******************************************************/
temp = 1;
for (i=1; i<=n; i++)
fak = fak * i;
return (fak);
}
void main()
{
int fac;
printf("Masukkan berapa faktorial : ");
scanf("%d",&fac);
printf("Hasil faktorial dari adalah : %d\n", fact_it(fac));
}
Faktorial Rekursif
Metode Rekursif
• Cara lain untuk menyelesaikan permasalahan di
atas adalah dengan cara rekursi, dimana n!
adalah hasil kali dari n dengan (n-1)!.
• Untuk menyelesaikan (n-1)! adalah sama
dengan n!, sehingga (n-1)! adalah n-1 dikalikan
dengan (n-2)!, dan (n-2)! adalah n-2 dikalikan
dengan (n-3)! dan seterusnya sampai dengan n
= 1, kita menghentikan penghitungan n!
Faktorial Rekursif (2)
• n! = 1 if n=0 anchor
• n! = n*(n-1)! if n>0 inductive step
• 0! =1
• 1! = 1*(1-1)!
• = 1*0!
• = 1*1
• =1
• 2! = 2*(2-1)!
• = 2*1!
• = 2*1
• =2
• 3! = 3*(3-1)!
• = 3*2!
• = 3*2
• =6
Program Rekursif
#include <stdio.h>
int fact_rec(int n)
{
/**********************************************************
Menghitung sebuah faktorial secara rekursif
***********************************************************/
if (n < 0)
return 0;
else if (n == 0)
return 1;
else if (n == 1)
return 1;
else
return n * fact_rec(n-1);
}
void main()
{
int fac;
printf("Masukkan berapa faktorial : ");
scanf("%d",&fac);
printf("Hasil faktorial dari adalah : %d\n", fact_rec(fac));
}
Fibonacci
int
int fibo2
fibo2 (int
(int n){
n){
if
if (n
(n <=
<= 1)
1) return
return n;n;
int
int result[10];
result[10];
result[0]
result[0] == 1; 1;
result[1] =
result[1] = 1; 1;
for
for (int
(int iiii == 2;
2; ii
ii <=
<= n;
n; ii++)
ii++) {{
result[ii]
result[ii] == result[ii
result[ii -- 2]2]
++ result[ii
result[ii -- 1];1];
}}
return
return result[n];
result[n];
}}
Tail Rekursif
• Implementasi rekursif yang lebih efficient.
• Pendekatan Tail Recursive.
public
public static
static long
long fib4
fib4 (int
(int n){
n){
return
return fiboHelp(0,1,n);
fiboHelp(0,1,n);
}}
static
static long
long fiboHelp(long
fiboHelp(long x,
x, long
long y,
y, int
int n){
n){
if
if (n==0)
(n==0) return
return x;
x;
else
else if
if (n==1)
(n==1) return
return y;
y;
else
else return
return fiboHelp(y,
fiboHelp(y, x+y,
x+y, n-1);
n-1);
}}
FPB (Faktor Persekutuan
Terbesar)
do{
r = m % n;
if (r!=0){
m = n;
n = r;
}
} while(r==0);
• Tampilkan n
FPB (3)
• Rekursif:
int FPB(int m,int n){
if(m==0) return n;
else if(m<n) return FPB(n,m);
else return FPB(m%n,n);
}
Ilustrasi FPB rekursif
• FPB(228,90) m>n
• FPB(48,90) m<n
• FPB(90,48) m>n
• FPB(42,48) m<n
• FPB(48,42) m>n
• FPB(6,42) m<n
• FPB(42,6) m>n
• FPB(0,6) m=0
Legenda Menara Hanoi
(oleh Edouard Lucas abad 19)
• Algoritma:
• Jika n==1, pindahkan pringan dari A ke C
• Jika tidak:
• Pindahkan n-1 piringan dari A ke B menggunakan
C sebagai tampungan
• Pindahkan n-1 piringan dari B ke C menggunakan
A sebagai tampungan
Program
#include <stdio.h>
void towers(int n, char awal, char akhir, char antara)
{
if(n==1)
printf("Pindahkan piringan 1 dari %c ke %c\n", awal,akhir);
else{
towers(n-1, awal, antara, akhir);
printf("Pindahkan piringan %d dari %c ke %c\n", n, awal, akhir);
towers(n-1, antara, akhir, awal);
}
}
void main()
{
int n;
printf("Berapa piringan ? ");scanf("%d", &n);
towers(n, 'A', 'C', 'B');
}
Capture Tower of Hanoi
Ilustrasi Tower of Hanoi
Proses Kerja
Pemangkatan