Die rekursive Funktion ist eine Funktion, die von selbst aufruft
Es ermöglicht Programmierern, effiziente Programme mit einer minimalen Menge an Code zu schreiben .
Der Nachteil ist, dass sie Endlosschleifen und andere unerwartete Ergebnisse verursachen können, wenn sie nicht richtig geschrieben werden .
Ich werde sowohl die einfache rekursive Funktion als auch die Schwanzrekursive Funktion erklären
Um eine einfache rekursive Funktion zu schreiben
- Der erste zu berücksichtigende Punkt ist, wann Sie sich entscheiden sollten, aus der Schleife herauszukommen, die die if-Schleife ist
- Der zweite ist, was zu tun ist, wenn wir unsere eigene Funktion sind
Aus dem gegebenen Beispiel:
public static int fact(int n){
if(n <=1)
return 1;
else
return n * fact(n-1);
}
Aus dem obigen Beispiel
if(n <=1)
return 1;
Ist der entscheidende Faktor, wann die Schleife verlassen werden soll
else
return n * fact(n-1);
Ist die eigentliche Verarbeitung durchzuführen
Lassen Sie mich die Aufgabe einzeln aufteilen, um das Verständnis zu erleichtern.
Mal sehen, was intern passiert, wenn ich renne fact(4)
- Einsetzen von n = 4
public static int fact(4){
if(4 <=1)
return 1;
else
return 4 * fact(4-1);
}
If
Die Schleife schlägt fehl und geht zur else
Schleife, sodass sie zurückkehrt4 * fact(3)
Im Stapelspeicher haben wir 4 * fact(3)
Einsetzen von n = 3
public static int fact(3){
if(3 <=1)
return 1;
else
return 3 * fact(3-1);
}
If
Die Schleife schlägt fehl und geht zur else
Schleife
so kehrt es zurück 3 * fact(2)
Denken Sie daran, wir haben `` `4 * fact (3)` `genannt
Die Ausgabe für fact(3) = 3 * fact(2)
Soweit hat der Stack 4 * fact(3) = 4 * 3 * fact(2)
Im Stapelspeicher haben wir 4 * 3 * fact(2)
Einsetzen von n = 2
public static int fact(2){
if(2 <=1)
return 1;
else
return 2 * fact(2-1);
}
If
Die Schleife schlägt fehl und geht zur else
Schleife
so kehrt es zurück 2 * fact(1)
Denken Sie daran, wir haben angerufen 4 * 3 * fact(2)
Die Ausgabe für fact(2) = 2 * fact(1)
Soweit hat der Stack 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)
Im Stapelspeicher haben wir 4 * 3 * 2 * fact(1)
Einsetzen von n = 1
public static int fact(1){
if(1 <=1)
return 1;
else
return 1 * fact(1-1);
}
If
Schleife ist wahr
so kehrt es zurück 1
Denken Sie daran, wir haben angerufen 4 * 3 * 2 * fact(1)
Die Ausgabe für fact(1) = 1
Soweit hat der Stack 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1
Schließlich ist das Ergebnis von Tatsache (4) = 4 · 3 · 2 · 1 = 24
Die Schwanzrekursion wäre
public static int fact(x, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(x-1, running_total*x);
}
}
- Einsetzen von 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
Die Schleife schlägt fehl und geht zur else
Schleife, sodass sie zurückkehrtfact(3, 4)
Im Stapelspeicher haben wir fact(3, 4)
Einsetzen von n = 3
public static int fact(3, running_total=4) {
if (x==1) {
return running_total;
} else {
return fact(3-1, 4*3);
}
}
If
Die Schleife schlägt fehl und geht zur else
Schleife
so kehrt es zurück fact(2, 12)
Im Stapelspeicher haben wir fact(2, 12)
Einsetzen von n = 2
public static int fact(2, running_total=12) {
if (x==1) {
return running_total;
} else {
return fact(2-1, 12*2);
}
}
If
Die Schleife schlägt fehl und geht zur else
Schleife
so kehrt es zurück fact(1, 24)
Im Stapelspeicher haben wir fact(1, 24)
Einsetzen von n = 1
public static int fact(1, running_total=24) {
if (x==1) {
return running_total;
} else {
return fact(1-1, 24*1);
}
}
If
Schleife ist wahr
so kehrt es zurück running_total
Die Ausgabe für running_total = 24
Schließlich ist das Ergebnis der Tatsache (4,1) = 24