Fungsi rekursif adalah fungsi yang memanggil dengan sendirinya
Ini memungkinkan pemrogram untuk menulis program yang efisien menggunakan jumlah kode minimal .
Kelemahannya adalah bahwa mereka dapat menyebabkan loop tak terbatas dan hasil tak terduga lainnya jika tidak ditulis dengan benar .
Saya akan menjelaskan fungsi Rekursif Sederhana dan fungsi Rekursif Ekor
Untuk menulis fungsi rekursif sederhana
- Hal pertama yang perlu dipertimbangkan adalah kapan Anda harus memutuskan keluar dari loop yang merupakan loop if
- Yang kedua adalah proses apa yang harus dilakukan jika kita adalah fungsi kita sendiri
Dari contoh yang diberikan:
public static int fact(int n){
if(n <=1)
return 1;
else
return n * fact(n-1);
}
Dari contoh di atas
if(n <=1)
return 1;
Apakah faktor penentu kapan harus keluar dari loop
else
return n * fact(n-1);
Apakah pemrosesan sebenarnya harus dilakukan
Biarkan saya memecahkan tugas satu per satu agar mudah dipahami.
Mari kita lihat apa yang terjadi secara internal jika saya lari fact(4)
- Mengganti n = 4
public static int fact(4){
if(4 <=1)
return 1;
else
return 4 * fact(4-1);
}
If
loop gagal sehingga beralih ke else
loop sehingga kembali4 * fact(3)
Dalam memori tumpukan, kami punya 4 * fact(3)
Mengganti n = 3
public static int fact(3){
if(3 <=1)
return 1;
else
return 3 * fact(3-1);
}
If
loop gagal sehingga beralih ke else
loop
jadi itu kembali 3 * fact(2)
Ingat kami menyebut `` 4 * fakta (3) ''
Output untuk fact(3) = 3 * fact(2)
Sejauh ini tumpukan itu 4 * fact(3) = 4 * 3 * fact(2)
Dalam memori tumpukan, kami punya 4 * 3 * fact(2)
Mengganti n = 2
public static int fact(2){
if(2 <=1)
return 1;
else
return 2 * fact(2-1);
}
If
loop gagal sehingga beralih ke else
loop
jadi itu kembali 2 * fact(1)
Ingat kami menelepon 4 * 3 * fact(2)
Output untuk fact(2) = 2 * fact(1)
Sejauh ini tumpukan itu 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)
Dalam memori tumpukan, kami punya 4 * 3 * 2 * fact(1)
Mengganti n = 1
public static int fact(1){
if(1 <=1)
return 1;
else
return 1 * fact(1-1);
}
If
loop benar
jadi itu kembali 1
Ingat kami menelepon 4 * 3 * 2 * fact(1)
Output untuk fact(1) = 1
Sejauh ini tumpukan itu 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1
Akhirnya, hasil dari fakta (4) = 4 * 3 * 2 * 1 = 24
The Tail Rekursi akan
public static int fact(x, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(x-1, running_total*x);
}
}
- Mengganti n = 4
public static int fact(4, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(4-1, running_total*4);
}
}
If
loop gagal sehingga beralih ke else
loop sehingga kembalifact(3, 4)
Dalam memori tumpukan, kami punya fact(3, 4)
Mengganti n = 3
public static int fact(3, running_total=4) {
if (x==1) {
return running_total;
} else {
return fact(3-1, 4*3);
}
}
If
loop gagal sehingga beralih ke else
loop
jadi itu kembali fact(2, 12)
Dalam memori tumpukan, kami punya fact(2, 12)
Mengganti n = 2
public static int fact(2, running_total=12) {
if (x==1) {
return running_total;
} else {
return fact(2-1, 12*2);
}
}
If
loop gagal sehingga beralih ke else
loop
jadi itu kembali fact(1, 24)
Dalam memori tumpukan, kami punya fact(1, 24)
Mengganti n = 1
public static int fact(1, running_total=24) {
if (x==1) {
return running_total;
} else {
return fact(1-1, 24*1);
}
}
If
loop benar
jadi itu kembali running_total
Output untuk running_total = 24
Akhirnya, hasil dari fakta (4,1) = 24