Eine return-Anweisung übergibt einen Wert an den unmittelbaren Aufrufer des Aufrufrahmens der aktuellen Funktion. Im Falle einer Rekursion kann dieser unmittelbare Aufrufer ein weiterer Aufruf derselben Funktion sein.
Wenn Sie in den meisten Sprachen den Rückgabewert einer von Ihnen aufgerufenen Funktion nicht verwenden (rekursiv oder nicht), wird dieser Rückgabewert entweder verworfen oder es handelt sich um einen diagnostizierbaren Fehler. In einigen Sprachen wird der Rückgabewert des letzten Funktionsaufrufs automatisch als Rückgabewert des aktuellen Funktionsaufrufs wiederverwendet, es wird jedoch nicht zwischen normalen und rekursiven Funktionsaufrufen unterschieden.
Angenommen, nicht verwendete Rückgabewerte werden stillschweigend verworfen, wenn Sie den Code folgendermaßen geschrieben haben:
list *search_list(list *l, item_type x) {
if (l == NULL) return(NULL);
if (l->item == x)
return(l);
else
search_list(l->next, x); // no return!
}
Dann wird search_list
nur ein definierter Wert für eine leere Liste (NULL) zurückgegeben oder wenn das erste Element mit dem gesuchten Wert übereinstimmt. Sobald die Funktion in den rekursiven Aufruf eintritt, wissen Sie nicht, was das Ergebnis sein wird, da das Ergebnis des rekursiven Aufrufs verworfen wird.
Darüber hinaus versprechen Sie, einen Wert aus Ihrer Funktion zurückzugeben, aber Sie haben einen Pfad (den rekursiven), in dem Sie nicht angeben, welcher Wert zurückgegeben werden soll. Abhängig von der Sprache, die Sie verwenden, führt dies in der Regel entweder zu einer obligatorischen Diagnose oder zu undefiniertem Verhalten (was abgekürzt bedeutet: Es kann alles passieren und das kann sich jederzeit ohne Vorankündigung ändern. Machen Sie niemanden außer sich selbst haftbar, wenn es kaputt geht Ihre wichtigste Präsentation). In einigen Situationen scheint der fehlende Rückgabewert zu funktionieren, dies kann sich jedoch beim nächsten Ausführen des Programms ändern (mit oder ohne Neukompilierung).
return
tut.