TL; DR: Gehen funktionale Sprachen besser mit Rekursion um als nicht funktionale?
Ich lese gerade Code Complete 2. Irgendwann im Buch warnt uns der Autor vor einer Rekursion. Er sagt, dass dies nach Möglichkeit vermieden werden sollte und dass Funktionen mit Rekursion im Allgemeinen weniger effektiv sind als eine Lösung mit Schleifen. Als Beispiel hat der Autor eine Java-Funktion geschrieben, die mithilfe der Rekursion die Fakultät einer Zahl wie dieser berechnet (sie ist möglicherweise nicht genau dieselbe, da ich das Buch momentan nicht bei mir habe):
public int factorial(int x) {
if (x <= 0)
return 1;
else
return x * factorial(x - 1);
}
Dies wird als schlechte Lösung dargestellt. In funktionalen Sprachen ist die Verwendung von Rekursion jedoch häufig die bevorzugte Methode. Hier ist zum Beispiel die Fakultätsfunktion in Haskell mit Rekursion:
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
Und wird allgemein als gute Lösung akzeptiert. Wie ich gesehen habe, verwendet Haskell sehr oft die Rekursion, und ich habe nirgends gesehen, dass sie verpönt ist.
Meine Frage ist also im Grunde:
- Behandeln funktionale Sprachen Rekursionen besser als nichtfunktionale?
EDIT: Ich bin mir bewusst, dass die Beispiele, die ich verwendet habe, nicht die besten sind, um meine Frage zu veranschaulichen. Ich wollte nur darauf hinweisen, dass Haskell (und funktionale Sprachen im Allgemeinen) Rekursion viel häufiger als nicht funktionale Sprachen verwendet.
factorial n = product [1..n]
ist prägnanter, effizienter und überläuft den Stapel nicht für große n
(und wenn Sie Memoisierung benötigen, sind ganz andere Optionen erforderlich). product
wird in Bezug auf einige definiert fold
, die sich rekursiv definiert, aber mit äußerster Vorsicht. Rekursion ist die meiste Zeit eine akzeptable Lösung, aber es ist immer noch leicht, es falsch / suboptimal zu machen.