Wenn ich schreibe: DoSomething (3), druckt das Terminal 1213121, aber ich bin nicht in der Lage, den rekursiven Prozess zu folgen, da es nur einen Basisfall und keinen anderen Fall gibt. Was macht die Funktion, wenn n == 0? Und wie geht das den rekursiven Schritt?Wie löse ich diese Java-Rekursion ohne einen anderen Fall?
Antwort
Rekursion ist nicht notwendig, base
Fall zu haben. Es erfordert nur 2 Dinge:
- ein Punkt das Programm beendet werden kann (
i == 0
in diesem Fall) - jedem rekursiven Aufruf läuft in einer Richtung, dass Punkt (
doSomething(n - 1)
in diesem Fall stattdoSomething(n + 1)
) nähert
Wenn Sie in einem base
Fall denken bevorzugen, ist der Code genau das gleiche wie:
public void doSomething(int n){
if (n <= 0) {
return;
}
doSomething(n-1);
System.out.print(n);
doSomething(n-1);
}
Falls Sie interessiert sind, ähnelt Ihre Codelogik der rekursiven Version von inorder traversal
des Binärbaums. Sie können sich für weitere Einsichten auf https://en.wikipedia.org/wiki/Tree_traversal#In-order beziehen.
Was macht die Funktion, wenn n == 0?
Absolut nichts.
Und wie geht das den rekursiven Schritt?
Es wird nicht fortgefahren.
Und es sollte nicht fortfahren. Wenn n <= 0
sollte der Code nicht weiter recurse.
Jemand riet Ihnen, den Code mit einem Debugger zu starten, um Ihnen zu visualisieren was vor sich geht. Das sollte man mit diesem konzeptionellen Problem helfen zu:
Ich bin nicht in der Lage dem rekursiven Prozess zu folgen, weil es nur ein Basisfall ist und kein
else
Fall.
Sie haben die Grundlagen der Rekursion falsch verstanden. Es erfordert keinen else
Fall. Was ist eigentlich erfordert, ist eine Möglichkeit, die Rekursion zu stoppen. Ein else
Fall ist eine Möglichkeit, aber es gibt eine Vielzahl von anderen.
Oder ..., um es zu Ihrem Beispiel zu bringen ... Ihr Code auf diese entspricht:
public void doSomething(int n){
if (n > 0){
doSomething(n-1);
System.out.print(n);
doSomething(n-1);
} else {
// this is a comment
}
}
Jetzt gibt es einen else
Fall ... was ein leerer Block ist. Oder Sie könnten eine redundante return
Anweisung in den Block schreiben. (Ich nehme an, dass Sie herausfinden können warum es redundant ist!)
Ich denke, dass dieser Code ein gutes Beispiel für Rekursion ist. Es erzeugt alle Kombinationen mit 0
und 1
und Länge 5
rekursiv, ein Muster Ergebnisse:
Ergebnis:
00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111
Code:
class Stringhelper {
public Stringhelper() {
}
public String getstring(String string,int beginning,int ending) {
if (string.length() != 0) {
String newstring="";
for (int iter=Math.abs(beginning); iter < ending && iter < string.length(); iter=iter+1) {
newstring=newstring+Character.toString(string.charAt(iter));
}
return newstring;
}
else {
return "";
}
}
}
public class Counter {
public String abil=""; //Possible Combinations
public int iter=0;
public Stringhelper shelper=new Stringhelper();
public void loop(int iter) {
for (int i=0; i < 2; i++) {
abil=shelper.getstring(abil,0,iter); //Crop everything until this char, if string was 010, for and iter is 2 : 01+result of this loop
abil=abil+Integer.toString(i);
if (iter==4) { //0,1,2,3,4=Length 5
System.out.println(abil);
}
else {
loop(iter+1);
}
}
}
public Counter() {
loop(iter);
}
public static void main(String args[]){
new Counter();
}
}
Es funktioniert so:
Für Beispiel mit der Länge 2 * 2 = 4 Kombinationen.
ist:
00
01
10
11
Aber wie es das macht produzieren?
Es funktioniert so:
Ersten Aufruf: loop (0) ausgeführt wird.
Die Schleife hat eigentlich i=0
. Es schreibt es nieder. Die Zeichenfolge lautet "0"
. Jetzt startet es loop(1)
. Diese Funktion hat i=0
zuerst, fügt es hinzu, jetzt ist die Zeichenkette "00"
, es bemerkt, dass es bereits die zweite Schleife ist, und so druckt es es, aber startet die Funktion nicht erneut. "00"
wird ausgedruckt. Jetzt geht die Schleife weiter. i=1
. Zuerst versucht es, alle Zeichen bis jetzt zu schneiden, also von "00"
bleibt dort nur die erste Null, also sein "0"
. Jetzt ist "1"
angehängt, String ist "01"
. Es merkt, dass es bereits die zweite Schleife ist, und so druckt es es, aber startet die Funktion nicht erneut. "01"
wird gedruckt. Diese Funktion wurde fortgesetzt und es geht zurück zur ersten Funktion. Die Schleife läuft jetzt weiter, sie versucht alle Zeichen bis jetzt zu schneiden, also haben wir jetzt eine gelöschte Zeichenkette ""
. Es startet loop(1)
. Diese Funktion hat i=0
zuerst, fügt es der Zeichenfolge hinzu, jetzt ist die Zeichenfolge "10"
, es merkt, dass es bereits die zweite Schleife ist, und so druckt es, aber startet die Funktion nicht erneut. "10"
wird ausgedruckt. Jetzt geht die Schleife weiter. i=1
. Zuerst versucht es, alle Zeichen bis jetzt zu schneiden, also von "10"
, dort bleibt nur das erste Zeichen, also sein "1"
. Jetzt ist "1"
angehängt, String ist "11"
. Es merkt, dass es bereits die zweite Schleife ist, und so druckt es es, aber startet die Funktion nicht erneut. "11"
wird gedruckt. Kein Prozess läuft mehr.
- 1. Wie löse ich diese Fehler
- 2. Wie löse ich diese Devise Authentifizierungsherausforderung?
- 3. Wie löse ich diese Tensorflow-Warnungen auf?
- 4. Wie löse ich das
- 5. Wie löse ich diese Exponentialgleichung auf Excel Solver?
- 6. wie löse ich das brut.androlib.AndrolibException
- 7. Wie löse ich 'Web Compiler fand einen Fehler in Compilerconfig.json'?
- 8. Wie löse ich diesen Segmentierungsfehler?
- 9. Wie löse ich einen SRV-Eintrag in Python auf?
- 10. Wie löse ich iFrame in einem iFrame?
- 11. Wie löse ich diese Inkompatibilität der PHP-Version auf meinem Host und wie bekomme ich diese Kernel: Klasse richtig?
- 12. Wie löse ich Konflikte in TFS?
- 13. Wie löse ich diesen php is_dir code?
- 14. Wie löse ich meinen gemfile Fehler?
- 15. Wie speichere ich einen Vektor von std :: bind ohne einen speziellen Fall für die Vorlage?
- 16. Wie löse ich Eklipse Verzögerung Problem
- 17. Ohne von Fall Ausdruck
- 18. Wie löse ich die IL-Schachtelungstiefe?
- 19. Wie löse ich C# -Abhängigkeiten automatisch auf?
- 20. Wie löse ich eine Taste, indem ich darauf rutsche?
- 21. Wie kann ich einen anderen Farbwähler ohne preferenceActivity verwenden?
- 22. Wie löse ich Python-Listen-Comprehensions ein?
- 23. Wie löse ich den System.NullReferenceException Fehler
- 24. Wie löse ich den MMUMapper Fehler?
- 25. Woher weiß diese Seite, dass ich einen anderen Tab öffne?
- 26. Wie kann ich einen leeren Fall in Swift schreiben?
- 27. Fall Klasse ohne Parameter
- 28. Wie löse ich Dependency Injection in MVC-Filterattribute auf
- 29. Wie sortiere ich und löse Abfrage zusammen mit Mungo?
- 30. Wie löse ich mehrere linq-Abfragen in einem Vorgang auf, ohne eine Basisabfrage zu verwenden?
Wenn 'n <= 0' die Methode * liefert *, rein und einfach. –
Der Basisfall ist n == 0 und der rekursive Fall ist n> 1. Ich bin mir nicht sicher, was du fragst. – wvdz
Ich bin mir nicht sicher, was Sie erreichen wollen. Wenn n == 0 tut es nichts, es kehrt zurück. Was soll es tun, wenn n == 0? auch Sie die doSomething() zweimal aufrufen in der gleichen Schleife ist nicht falsch, aber scheint seltsam. – Timmeey