Funkcja rekurencyjna to funkcja, która sama się wywołuje
Umożliwia programistom pisanie wydajnych programów przy użyciu minimalnej ilości kodu .
Wadą jest to, że mogą powodować nieskończone pętle i inne nieoczekiwane wyniki, jeśli nie zostaną poprawnie napisane .
Wyjaśnię zarówno prostą funkcję rekurencyjną, jak i funkcję rekurencyjną ogona
Aby napisać prostą funkcję rekurencyjną
- Pierwszą kwestią do rozważenia jest to, kiedy należy zdecydować się na wyjście z pętli, która jest pętlą if
- Po drugie, co należy zrobić, jeśli jesteśmy naszą własną funkcją
Z podanego przykładu:
public static int fact(int n){
if(n <=1)
return 1;
else
return n * fact(n-1);
}
Z powyższego przykładu
if(n <=1)
return 1;
Decyduje o tym, kiedy wyjść z pętli
else
return n * fact(n-1);
Czy faktyczne przetwarzanie ma zostać wykonane
Pozwólcie, że podzielę zadanie po kolei, aby ułatwić zrozumienie.
Zobaczmy, co się dzieje wewnętrznie, gdy biegnę fact(4)
- Podstawiając n = 4
public static int fact(4){
if(4 <=1)
return 1;
else
return 4 * fact(4-1);
}
If
pętla kończy się niepowodzeniem, więc przechodzi do else
pętli i zwraca4 * fact(3)
W pamięci stosu mamy 4 * fact(3)
Podstawiając n = 3
public static int fact(3){
if(3 <=1)
return 1;
else
return 3 * fact(3-1);
}
If
pętla zawodzi, więc przechodzi w else
pętlę
więc wraca 3 * fact(2)
Pamiętaj, że nazwaliśmy `` 4 * fakt (3) ''
Dane wyjściowe dla fact(3) = 3 * fact(2)
Jak dotąd stos ma 4 * fact(3) = 4 * 3 * fact(2)
W pamięci stosu mamy 4 * 3 * fact(2)
Podstawiając n = 2
public static int fact(2){
if(2 <=1)
return 1;
else
return 2 * fact(2-1);
}
If
pętla zawodzi, więc przechodzi w else
pętlę
więc wraca 2 * fact(1)
Pamiętaj, że dzwoniliśmy 4 * 3 * fact(2)
Dane wyjściowe dla fact(2) = 2 * fact(1)
Jak dotąd stos ma 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)
W pamięci stosu mamy 4 * 3 * 2 * fact(1)
Podstawiając n = 1
public static int fact(1){
if(1 <=1)
return 1;
else
return 1 * fact(1-1);
}
If
pętla jest prawdziwa
więc wraca 1
Pamiętaj, że dzwoniliśmy 4 * 3 * 2 * fact(1)
Dane wyjściowe dla fact(1) = 1
Jak dotąd stos ma 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1
Ostatecznie wynik faktu (4) = 4 * 3 * 2 * 1 = 24
Recursion Tail byłoby
public static int fact(x, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(x-1, running_total*x);
}
}
- Podstawiając 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
pętla kończy się niepowodzeniem, więc przechodzi do else
pętli i zwracafact(3, 4)
W pamięci stosu mamy fact(3, 4)
Podstawiając n = 3
public static int fact(3, running_total=4) {
if (x==1) {
return running_total;
} else {
return fact(3-1, 4*3);
}
}
If
pętla zawodzi, więc przechodzi w else
pętlę
więc wraca fact(2, 12)
W pamięci stosu mamy fact(2, 12)
Podstawiając n = 2
public static int fact(2, running_total=12) {
if (x==1) {
return running_total;
} else {
return fact(2-1, 12*2);
}
}
If
pętla zawodzi, więc przechodzi w else
pętlę
więc wraca fact(1, 24)
W pamięci stosu mamy fact(1, 24)
Podstawiając n = 1
public static int fact(1, running_total=24) {
if (x==1) {
return running_total;
} else {
return fact(1-1, 24*1);
}
}
If
pętla jest prawdziwa
więc wraca running_total
Dane wyjściowe dla running_total = 24
Ostatecznie wynik faktu (4,1) = 24