Tail Call Optimization
Wenn ein Funktionsaufruf das Letzte ist, was passiert, kann der Compiler den bestehenden Stack-Frame wiederverwenden, statt einen neuen anzulegen. Rekursion wird dadurch zur Schleife.
Die Bedingung ist, dass der Aufruf in Tail-Position steht, also nach seiner Rückkehr keine Arbeit mehr übrig bleibt — return f(x) erfüllt das, return f(x) + 1 nicht, weil die Addition danach noch ausgeführt werden muss. Ist die Bedingung erfüllt, gibt es keinen Grund, die Rückgabeadresse zu sichern, und eine Rekursion beliebiger Tiefe läuft in konstantem Stack-Speicher. In Scheme ist das im Standard vorgeschrieben und die Grundlage dafür, dass sich im Sprachdesign jede Iteration als Rekursion ausdrücken lässt. In C, C++ und Rust machen es die Compiler bei eingeschalteter Optimierung, aber ohne Garantie — derselbe Code kann im Debug-Build also den Stack sprengen. JavaScript hat es in ES6 spezifiziert, aber nur Safari hat es je implementiert.