短路递归

时间:2014-09-05 12:21:11

标签: c++ recursion

是否可以在不获取stackoverflow的情况下执行以下操作?

int foo(int i = 0)
{
    return foo(--i) || i;
}

foo(--i)求值为0时,它应该返回false,因此返回i并结束执行。

2 个答案:

答案 0 :(得分:4)

你想要return !i || foo(--i)

请注意,||是短暂的。这意味着只要表达式的结果未知,评估(从左到右执行)将继续。所以我编写它的方式,i为零的情况将阻止递归。

(继续讨论更高级的问题,当相同的变量出现在多个子表达式中时,你需要非常小心,并且在某些子表达式中它的值会发生变化。我的!i--i可能让我遇到麻烦:我离这里的未定义的行为并不太远。实际上,事实证明我的代码是完全安全的,因为||是一个序列点||的评估顺序是明确定义的。但要小心。)

答案 1 :(得分:-1)

你编码的foo永远不会返回,因为它将继续递减i并递归。您需要在foo内查看,当i0时,您需要返回任何内容。