Das Wichtigste über Rekursion ist, dass es nichts besonderes ist. Wie bei allem in einem Verfahren braucht es eine Anweisung zu beenden, bevor die nächste Anweisung ausgeführt werden kann:
public void someMethod() {
someOtherMethod();
someLastMethod();
}
Mit Blick auf meinem Beispiel ist es offensichtlich, dass someLastMethod
wird nach someOtherMethod
beendet hat aufgerufen werden. Es ist wirklich egal, wenn Sie someOtherMethod
durch etwas rekursives ersetzen. Es muss beendet werden, bevor someLastMethod
aufgerufen werden kann. Wenn wieder auf Ihrer rekursive Methode suchen:
public void recMethod(String str, int n) {
if(n >= 0) {
recMethod(str, n – 1);
System.out.print(str.charAt(n));
recMethod(str, n – 1);
} else { // base case added for clarity
return;
}
}
Für jeden Anruf, wo n >= 0
, bevor die System.out.print
Methode um den Anruf zu recMethod
genannt wird, hat aufgerufen werden. Jeder Anruf zu recMethod hat seine eigenen n
und str
so können sie verschiedene Methoden in Betracht gezogen werden völlig außer ihrem Code ist ‚sehr ähnlich‘.
Jeder Aufruf entspricht entweder dem Basisfall oder benötigt das Ergebnis der gleichen Methode mit n dekrementiert. Ich möchte also vom Basisfall ausgehen und mich rückwärts arbeiten, wenn n -1
ist. Stellen Sie sich vor, Sie rufen recMethod("ABCD",-1)
was würde passieren? Nun, es druckt nichts oder "".
Ich sehe dann und es ruft den Basisfall, den wir wissen, tut nichts, dann druckt "A" und dann ruft es das gleiche wie die erste Anweisung, die wiederum nichts tut. So druckt er „A“
Wenn wir recMethod("ABCD",1)
suchen. Wir wissen, dass es recMethod("ABCD",0)
nennt, die „A“ druckt, dann druckt es „B“, dann recMethod("ABCD",0)
nennen, die „A“ druckt. So druckt es "ABA"
Wenn wir recMethod("ABCD",2)
betrachten. Wir wissen, dass es ruft recMethod("ABCD",1)
, die "ABA" druckt, dann druckt es "C", dann rufen Sie recMethod("ABCD",1)
, die "ABA" druckt. So druckt es "ABACABA"
Wenn wir recMethod("ABCD",3)
betrachten. Wir wissen, dass es recMethod("ABCD",2)
nennt die „ABACABA“ druckt, dann druckt es „D“, rufen dann recMethod("ABCD",2)
, den Druck „ABACABA“. So druckt es "ABACABADABACABA"
Da "abcd".charAt(4)
nicht funktioniert, macht es keinen Sinn, weiterzugehen.Vielleicht sollte der Code einen Test dafür haben oder vielleicht sollte es privat sein und ein öffentliches haben ohne n
das garantiert n
geht nie über str
Grenzen hinaus?
Wenn Sie sind, ein Verfahren zu machen, die rekursiv Sie das gleiche tun funktioniert.
Was sollte für den Basisfall passieren. (Wie sollte es aufhören)
Was passieren soll, wenn es nicht das Basismodell ist ausgedrückt, als ob die Methode funktioniert wie vorgesehen. Der Haken hier ist, dass Sie sicherstellen müssen, dass jeder Aufruf der gleichen Methode hier ein etwas einfacheres Problem ist, bei dem die Rekursion zwangsläufig einen Basisfall trifft, oder Sie erhalten eine unendliche Rekursion!
Das ist es! Es wird klappen.
Es gibt keine Rekursion in Ihrer Frage. –
Ich habe den Namen der Methode geändert, um das Beispiel klarer zu machen, habe aber vergessen, den Namen innerhalb der Methode zu ändern. – SirDanceAlot