【问题标题】:Complicated tail recursion case复杂的尾递归案例
【发布时间】:2013-12-25 07:36:10
【问题描述】:

在这种情况下,编译器是否可以识别尾递归?

void f(int x) {
    if (x == 1) {
        /* do_1... */
    }
    else if (x == 2) {
        /* do_2... */
    }
    else if (x == 3) { // here, we want do_2 and do_3; the order doesn't matter
        /* do_3... */
        f(2); // this should be tail recursive
    }
    else if (x == 4) {
        /* do_4... */
    }
}

f(2); 之后放置return; 会帮助编译器将其识别为尾递归情况吗?

【问题讨论】:

  • 您是否尝试过查看编译器输出?您的问题的答案是特定于编译器的,包括版本、优化标志等。
  • 您不应该依赖 C++ 编译器优化尾递归。如果正确的行为取决于不炸毁堆栈,则应消除递归。
  • 另外检查堆栈帧重用是否正在发生也是一种选择! :)
  • 对于这种情况,特别是调用f(2) 原则上甚至可以内联,更不用说尾递归了。顺便说一句,考虑switch(x) { case 1: do_1; break; case 3 : do_3; /* fall through */ case 2: do_2; break; case 4: do_4;
  • 如果一个特定的函数是尾递归的,那么编译器总是“有可能”识别它。我认为这个问题没有意义。

标签: c++ algorithm recursion tail-recursion


【解决方案1】:

识别尾调用优化机会的编译器在特定用例中识别它应该没有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 2011-07-01
    • 2015-06-25
    • 1970-01-01
    • 2016-05-09
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多