Um Ihre spezielle Frage zu beantworten: Nein, unter dem Gesichtspunkt des Lernens einer Sprache ist Rekursion keine Funktion. Wenn Ihr Professor Sie wirklich angedockt hat, weil Sie eine "Funktion" verwendet haben, die er noch nicht unterrichtet hat, war das falsch.
Wenn Sie zwischen den Zeilen lesen, besteht eine Möglichkeit darin, dass Sie durch die Verwendung der Rekursion vermieden haben, jemals eine Funktion zu verwenden, die als Lernergebnis für seinen Kurs gedacht war. Zum Beispiel haben Sie möglicherweise überhaupt keine Iteration verwendet, oder Sie haben nur for
Schleifen verwendet, anstatt beide for
und zu verwenden while
. Es ist üblich, dass eine Aufgabe darauf abzielt, Ihre Fähigkeit zu testen, bestimmte Dinge zu tun, und wenn Sie dies vermeiden, kann Ihr Professor Ihnen die für diese Funktion vorgesehenen Noten einfach nicht gewähren. Wenn dies jedoch wirklich die Ursache für Ihre verlorenen Noten war, sollte der Professor dies als eigene Lernerfahrung betrachten. Wenn der Nachweis bestimmter Lernergebnisse eines der Kriterien für eine Aufgabe ist, sollte dies den Studenten klar erklärt werden .
Trotzdem stimme ich den meisten anderen Kommentaren und Antworten zu, dass Iteration hier eine bessere Wahl ist als Rekursion. Es gibt mehrere Gründe, und obwohl andere Menschen sie bis zu einem gewissen Grad berührt haben, bin ich mir nicht sicher, ob sie den Gedanken hinter ihnen vollständig erklärt haben.
Stapelüberläufe
Das offensichtlichere ist, dass Sie das Risiko eines Stapelüberlauffehlers haben. Realistisch gesehen ist es sehr unwahrscheinlich, dass die von Ihnen geschriebene Methode tatsächlich zu einer führt, da ein Benutzer viele Male falsche Eingaben machen müsste, um tatsächlich einen Stapelüberlauf auszulösen.
Beachten Sie jedoch, dass sich nicht nur die Methode selbst, sondern auch andere Methoden, die höher oder niedriger in der Aufrufkette sind, auf dem Stapel befinden. Aus diesem Grund ist es für jede Methode ziemlich unhöflich, den verfügbaren Stapelspeicherplatz gelegentlich zu verschlingen. Niemand möchte sich ständig um freien Speicherplatz sorgen müssen, wenn er Code schreibt, da das Risiko besteht, dass anderer Code unnötig viel davon verbraucht hat.
Dies ist Teil eines allgemeineren Prinzips im Software-Design, das als Abstraktion bezeichnet wird. Wenn Sie anrufen DoThing()
, müssen Sie sich im Wesentlichen nur darum kümmern, dass die Sache erledigt ist. Sie sollten nicht über die Details der Implementierung zu kümmern, wie es gemacht wird . Die gierige Verwendung des Stapels verstößt jedoch gegen dieses Prinzip, da sich jedes Codebit Gedanken darüber machen muss, wie viel Stapel es sicher annehmen kann, dass es ihm durch Code an anderer Stelle in der Aufrufkette überlassen wurde.
Lesbarkeit
Der andere Grund ist die Lesbarkeit. Das Ideal, das Code anstreben sollte, ist ein für Menschen lesbares Dokument, in dem jede Zeile einfach beschreibt, was es tut. Nehmen Sie diese beiden Ansätze:
private int getInput() {
int input;
do {
input = promptForInput();
} while (!inputIsValid(input))
return input;
}
gegen
private int getInput() {
int input = promptForInput();
if(inputIsValid(input)) {
return input;
}
return getInput();
}
Ja, diese beiden funktionieren, und ja, sie sind beide ziemlich leicht zu verstehen. Aber wie könnten die beiden Ansätze auf Englisch beschrieben werden? Ich denke, es wäre so etwas wie:
Ich werde zur Eingabe auffordern, bis die Eingabe gültig ist, und sie dann zurückgeben
gegen
Ich werde zur Eingabe auffordern. Wenn die Eingabe gültig ist, gebe ich sie zurück. Andernfalls erhalte ich die Eingabe und gebe stattdessen das Ergebnis zurück
Vielleicht können Sie sich für letzteres etwas weniger klobige Formulierungen vorstellen, aber ich denke, Sie werden immer feststellen, dass die erste konzeptionell eine genauere Beschreibung dessen sein wird, was Sie tatsächlich versuchen zu tun. Dies bedeutet nicht, dass die Rekursion immer weniger lesbar ist. In Situationen, in denen es glänzt, wie z. B. beim Durchqueren von Bäumen, können Sie dieselbe Art der Nebeneinanderanalyse zwischen Rekursion und einem anderen Ansatz durchführen, und Sie werden mit ziemlicher Sicherheit feststellen, dass Rekursion Code liefert, der Zeile für Zeile klarer selbstbeschreibend ist.
Für sich genommen sind dies beide kleine Punkte. Es ist sehr unwahrscheinlich, dass dies jemals wirklich zu einem Stapelüberlauf führen würde, und der Gewinn an Lesbarkeit ist gering. Aber jedes Programm wird eine Sammlung vieler dieser kleinen Entscheidungen sein. Selbst wenn sie isoliert nicht viel ausmachen, ist es wichtig, die Prinzipien zu lernen, die dahinter stehen, um sie richtig zu machen.