Scala/C++:尾递归函数而不是输入循环
Scala/C++: Tail Recursive function instead of input loop
自从接触到Scala后,我就开始用尾递归写函数,了解到C++编译器也支持尾递归,甚至优化了尾递归函数。现在我很好奇这种优化的可靠性如何,是否可以将它用于我的主循环或命令提示符之类的事情?
传统上我是这样写命令提示符的:
bool running = true;
string input;
while(running_){
input = getInput();
executeCommand(input);
if(input == "quit") running_ = false;
}
现在用这样的尾递归函数替换它是不是一件坏事?
string input = "nothing";
void parseInput(){
if(input != "nothing") executeCommand(input);
getline(cin, input);
if(input != "quit") parseInput();
}
TCO(尾调用优化)被不同的编译器以不同的可靠性级别应用。在您的特定情况下,您通过在分支内调用后不立即返回来使编译器更加困难。编译器将不得不采取额外的步骤来确保没有代码在调用完成后执行。
要确保 TCO 确实发生,您必须依靠您最好的朋友。你最好的朋友是 asm 输出。
自从接触到Scala后,我就开始用尾递归写函数,了解到C++编译器也支持尾递归,甚至优化了尾递归函数。现在我很好奇这种优化的可靠性如何,是否可以将它用于我的主循环或命令提示符之类的事情?
传统上我是这样写命令提示符的:
bool running = true;
string input;
while(running_){
input = getInput();
executeCommand(input);
if(input == "quit") running_ = false;
}
现在用这样的尾递归函数替换它是不是一件坏事?
string input = "nothing";
void parseInput(){
if(input != "nothing") executeCommand(input);
getline(cin, input);
if(input != "quit") parseInput();
}
TCO(尾调用优化)被不同的编译器以不同的可靠性级别应用。在您的特定情况下,您通过在分支内调用后不立即返回来使编译器更加困难。编译器将不得不采取额外的步骤来确保没有代码在调用完成后执行。
要确保 TCO 确实发生,您必须依靠您最好的朋友。你最好的朋友是 asm 输出。