【问题标题】:Scala/C++: Tail Recursive function instead of input loopScala/C++:尾递归函数而不是输入循环
【发布时间】:2015-09-11 04:44:29
【问题描述】:

自从我接触 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();
}

【问题讨论】:

    标签: c++ tail-recursion


    【解决方案1】:

    TCO(尾调用优化)由不同的编译器以不同级别的可靠性应用。在您的特定情况下,通过在分支内调用后不立即返回,编译器变得更加困难。编译器将不得不采取额外的步骤来确保在调用完成后没有代码将被执行。

    要确保 TCO 确实发生,您必须依靠您最好的朋友。你最好的朋友是 asm 输出。

    【讨论】:

    • 如果我写 if(input != "quit") thisFunction(); else cout << "bye!\n"; 会不会对编译器更友好?
    • @BigBadWolf,只需在调用 thisFunction 后将 return 放入分支中即可。
    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多