2014-09-05 50 views
-1

是否有可能在没有获得计算器的情况下执行以下操作?短路递归

​​

foo(--i)的计算结果为0,它应该返回false,因此返回i和终止执行。

+1

'||'是一个布尔表达式,所以不是你想要的。但是这是行不通的,因为在有机会知道它是否应该退出之前,你总是调用'foo'。 – crashmstr 2014-09-05 12:23:43

+0

你想要做的是什么? – Kieveli 2014-09-05 12:26:14

+3

先试着在纸上做,然后你会发现它不起作用。 – 2014-09-05 12:26:56

回答

3

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

请注意||是短期循环。这意味着只有当表达式的结果未知时,评估(从左到右执行)才会继续。所以按照我写的方式,i为零将阻止递归。如果在同一个变量出现在多个子表达式中并且它的值在一些子表达式中发生了变化,那么在计算表达式时需要非常小心,我的!i--i可能会得到我遇到了麻烦:我不太远离未定义的行为事实上,事实证明,我的代码是完全安全的,因为||序列点,并且||的评估顺序是明确定义的。但要小心。)

+0

也许但问题不是那么清楚恕我直言。我会留下这个答案,因为它解决了评估和递归阻塞问题。 – Bathsheba 2014-09-05 12:33:57

+0

@Debasish易于修复:'return!i && foo( - i);' – user4011744 2014-09-05 12:35:31

-1

从你已编码foo永远不会返回,因为它会co ntinuosly继续减少i并递归。您需要foo内的支票,当您将i作为0时,它将返回您想要的任何东西。

+0

@DebasishJana这是问题的复制粘贴而不是替代答案 – 2014-09-05 12:31:26

+0

人们downvoting,请让我知道什么是错的答案。 – 2014-09-05 12:47:16