我寫了一段代碼來打印n對括號的所有有效組合。但是,在我第一次嘗試時,算法輸出所有組合兩次,也就是說。該代碼是:爲什麼`--var`和`var-1`的工作方式不同?
public static void solve(char[] string, int open, int closed, int index)
{
if (open < 0 || closed < open) {
return;
}
if (open == 0 && closed == 0) {
System.out.println(string);
}
if (open > 0) {
string[index] = '(';
solve(string, --open, closed, ++index);
}
if (closed > open) {
string[index] = ')';
solve(string, open, --closed, ++index);
}
}
我花了大量的時間,以查看出了什麼問題。我認爲代碼進入最後如果分支超過它應該。然後,在嘗試不同的東西,我意識到 改變
solve(string, --open, closed, ++index);
到
solve(string, open-1, closed, ++index);
改變的結果。這導致獲得java.lang.ArrayIndexOutOfBoundsException
。最後,我用相應的算術運算(例如,++index
到index+1
)替換了所有預增量操作,並且代碼正確運行。
我的問題是,不應該--open
和open-1
計算併發送相同的值作爲參數的函數?當他們應該計算相同的值時,代碼的行爲有什麼不同?
'--foo'改變'foo'的值; 'foo-1'沒有。 – IMSoP
檢查了這一點:http://stackoverflow.com/questions/561588/what-is-more-efficient-i-or-i –
被發現的另一件事情是,你如果部分多單可以運行,因爲你的天堂」 t used elseif – IMSoP