Rekursive Funktion und return statement

janineAlberos

Neues Mitglied
Hallo zusammen,
ich habe eine Frage zu rekursiven Funktionen in Java, genauer zur Funktionsweise des return Statements. Wenn ich die folgende Funktion in eclipse ausführen lasse, wird mir irgendwann mein "test" geprinted, ich weiß also, dass das Programm innerhalb der Schleife angekommen ist. Jetzt hätte ich gerne, dass die gesamte Funktion abbricht und mir mein a zurück gibt, es bricht aber glaube ich nur die Schleife ab, jedenfalls wird mir -6 aus dem letzten return statement zurückgegeben. Kann mir jemand sagen, was genau hier passiert und was ich tun muss, um im Fall arr[a]=key einfach a als return wert der kompletten Funktion erhalte?

public int function(double arr[], int first, int last, double key) {

if (last >= first) {
int a= first+halfOrRoundedUpHalf(last-first);

if (arr[a] == key) {
System.out.println("test");
return a;
}
else if (arr[a] < key ) {
last=a;

}
else if (arr[a] > key ) {
first=a;
}

if(last==first) {
if(arr[last]==key) {
return last;
}
else {
return -1;
}
}

funktion(arr,first,last,key);
}

return -6;

}

Vielen Dank schonmal 🙂
 
Java:
public int function(double arr[], int first, int last, double key) {

    if (last >= first) {
    int a= first+halfOrRoundedUpHalf(last-first);
        if (arr[a] == key) {
            System.out.println("test");
            return a;
        }
        else if (arr[a] < key ) {
            last=a;
        }
            else if (arr[a] > key ) {
                first=a;
            }
    if(last==first) {
            if(arr[last]==key) {
            return last;
            }
            else {
                return -1;
            }
        }
    funktion(arr,first,last,key);
    }
return -6;

}
 
Du machst den Fehler, den sehr viele machen bei rekursiven Methoden: Du ignorierst den Rückgabe-Wert von weiteren rekursiven Aufrufen.
Bei deinem Aufruf funktion(arr,first,last,key); ignorierst du das Ergebnis von diesem Aufruf.
Wenn du -1 zurücklieferst, dann beendet das nur diesen einen Methodenaufruf. Aber der Aufrufer davon muss auch darüber benachrichtigt werden (über den Rückgabewert des Aufrufes), um darauf reagieren zu können und dann die "Aufrufkette" weiter nach "oben" beenden zu können.
 
Du machst den Fehler, den sehr viele machen bei rekursiven Methoden: Du ignorierst den Rückgabe-Wert von weiteren rekursiven Aufrufen.
Bei deinem Aufruf funktion(arr,first,last,key); ignorierst du das Ergebnis von diesem Aufruf.
Wenn du -1 zurücklieferst, dann beendet das nur diesen einen Methodenaufruf. Aber der Aufrufer davon muss auch darüber benachrichtigt werden (über den Rückgabewert des Aufrufes), um darauf reagieren zu können und dann die "Aufrufkette" weiter nach "oben" beenden zu können.
Ah stimmt, vielen Dank! Ich habe jetzt einfach ein return statment vor den erneuten Methodenaufruf geschrieben. Das müsste doch dann alle Methodenaufrufe mit dem gewünschten Wert abbrechen oder? Es scheint auf jeden Fall, als würde es funktionieren.
 

Zurück
Oben