【发布时间】: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