2015-09-10 7 views
5

Seit ich in Scala bin, habe ich begonnen, Funktionen mit Tail-Rekursion zu schreiben und gelernt, dass C++ - Compiler dies auch unterstützen und sogar Tail-rekursive Funktionen optimieren. Jetzt bin ich neugierig, wie zuverlässig diese Optimierung ist, und ist es in Ordnung, sie für Dinge wie meine Hauptschleife oder Eingabeaufforderung zu verwenden?Scala/C++: Tail Recursive-Funktion anstelle der Eingangsschleife

Traditionell habe ich geschrieben Eingabeaufforderungen wie folgt aus:

bool running = true; 
string input; 
while(running_){ 
    input = getInput(); 
    executeCommand(input); 
    if(input == "quit") running_ = false; 
} 

Nun wäre es eine schlechte Sache sein, dies wie dies mit einem Schwanz rekursive Funktion zu ersetzen?

string input = "nothing"; 
void parseInput(){ 
    if(input != "nothing") executeCommand(input); 

    getline(cin, input); 
    if(input != "quit") parseInput(); 
} 
+0

fantastische idee! – UmNyobe

Antwort

2

TCO (tail-Call-Optimierung) mit unterschiedlicher Maß an Zuverlässigkeit von verschiedenen Compilern verwendet. In Ihrem speziellen Fall wird es für den Compiler noch schwieriger, wenn Sie nicht direkt nach dem Anruf in der Filiale zurückkehren. Der Compiler muss einen zusätzlichen Schritt ausführen, um sicherzustellen, dass kein Code existiert, der nach dem Aufruf ausgeführt wird.

Um sicherzustellen, dass TCO passiert ist, müssen Sie sich auf Ihren besten Freund verlassen. Dein bester Freund hier ist asm Ausgang.

+0

Wäre es kompilerfreundlicher, wenn ich 'if (input! =" Quit ") schreiben thisFunction(); sonst cout << "tschüss! \ n"; '? – BigBadWolf

+0

@BigBadWolf, setzen Sie einfach in den Zweig direkt nach dem Aufruf von thisFunction zurückzukehren. – SergeyA