Es gibt zwei Dinge, die sofort in den Sinn Pop:
- Die erste ist die
if ... then return else ...
Paradigma zu vermeiden, da die return
die else
überflüssig macht.
- Die zweite ist, den Anruf nur einmal zu tun (da es invariant ist).
diese Änderungen machen würden Sie so etwas wie:
int findMaximumValue(int list[], int first, int last) {
// List has one item, return it.
if (first == last)
return list[first];
// Get largest of all but first element in list.
int maxOfAllButFirst = findMaximumValue(list, first + 1, last);
// First is larger than all those others, return it.
if (list[first] > maxOfAllButFirst)
return list[first];
// Otherwise it's largest from the others.
return maxOfAllButFirst;
}
Ich soll jedoch erwähnen, dass Rekursion am besten für Algorithmen erfolgt, bei dem Lösungsraum schnell verringert (wie zB eine binäre Suche, wo Sie Verwerfen der Hälfte des verbleibenden Lösungsraums bei jedem rekursiven Aufruf).
Verwenden von Rekursion für etwas, wo der Lösungsraum langsam reduziert (wie diese, die im Grunde eine lineare Suche ist) ist nicht die beste Idee. Wenn die Tail-Call-Optimierung nicht möglich ist, ist der Stack-Speicherplatz wahrscheinlich nicht schnell genug.
Mit anderen Worten, der beste Weg, diesen Algorithmus eleganter zu machen, um sich aus einem rekursiven man in ein iterativen einem :-)
Ist die Funktion der Arbeit, wie es sollte? Wenn Sie eine Code-Überprüfung wünschen, senden Sie diese bitte stattdessen auf http://codereview.stackexchange.com/. –
Ja, und danke, ich poste es stattdessen dort. – kekstorm
Nein, es hat keine falsche Komplexität. –