2014-09-05 73 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