Mit Rekursion wie kann ich die lokale variable aktualisiert
Mit Rekursion wie kann ich die lokale variable aktualisiert, bis eine Bedingung erfüllt ist. Ich habe ein Beispiel unten, die erklärt, warum die Frage sehr gut. Die count-variable ist eine lokale variable und sehr Zeit die Methode geht durch die Zählung auf 0 gesetzt ist. Ich kann mich nicht bewegen die Zählung außerhalb der Methode hat es sich um eine lokale variable nicht statisch ist, oder irgendetwas anderes.. Die gewünschte Ausgabe sein soll (3 von 6)
public static int returnInt(int b) {
int count = 0;
if (b == 6) {
System.out.println(count + " " + b);
}
b += 2;
count++;
return returnInt(b);
}
- Warum sind Sie nicht erlaubt, etwas zu ändern?
- Nicht
count
nurint count == b / 2;
? Ansonsten müssen Sie passieren diecount
Variablen der rekursiven Funktion als gut. - Dir ist schon klar, dass
returnInt
nie, in der Tat, etwas zurückzugeben, richtig? 🙂 Weil es wird nicht aufhören, bis er stürzt mit einem stack-überlauf. (Rekursive algorithmen muss haben eine get-out-Klausel.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Pass
count
als zusätzlichen parameter an die Methode:Dann rufen Sie
returnInt
mit einem zusätzlichen argument von0
um Dinge zu beginnen.@Matt:
"...und zurück" 🙂Können Sie nicht. Lokale variable lokal ist, per definition. Es besteht nur im Rahmen der aktuellen Ausführung der Methode.
ABER haben Sie die folgenden Lösungen.
Das beste ist, übergeben Sie es als parameter der Methode (genau wie mit anderen parameter
b
.Wenn (aus unerfindlichen Gründen) Sie können nicht ändern, die Signatur der Methode können Sie setzen diese variable in
ThreadLocal
. In diesem Fall, selbst wenn mehrere threads ausführen der Methode gleichzeitig Ihren code thread-safe bleibt.Verschieben Sie diese variable auf Klassenebene ist die schlechteste Lösung, denn es ist nicht thread-sicher und bricht die Kapselung.
Diese Funktion wird Ihren stack overflow. Sie müssen einen Weg aus, wenn Sie mit Rekursion. Und wie für die variable Anzahl, die Sie definieren, die es wieder auf 0 jedes mal, es kann nicht initialisiert werden innerhalb der rekursiven Funktion. Versuchen Sie, übergeben es an Ihre Funktion als parameter, und auch eine Möglichkeit bieten, sich für Ihre Funktion.
den "return b" - Linie können Sie Ihren Weg aus...und Sie don ' Y unbedingt zurück b... zurück, was Sie brauchen.
Im Allgemeinen, erstellen returnIntInner(int b boxed zählen), bewegen Sie den Großteil der Logik, und ein Anruf, der von einem "thin" - version von returnInt. Feld
count
den "alten Stil" Weg ist die übergabe der Graf als ein int[1] array, so dass es zurückgegeben werden kann-ich habe nicht studiert, bis auf die neue Java-Referenz-parm syntax. Aber da dein code ist tail-rekursive und nicht zugreifen zu können, müssencount
nach den rekursiven aufrufen, können Sie übergeben Sie einfachcount
als regulären parameter.