2014-05-03 83 views
3

我寫了一段代碼來打印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。最後,我用相應的算術運算(例如,++indexindex+1)替換了所有預增量操作,並且代碼正確運行。

我的問題是,不應該--openopen-1計算併發送相同的值作爲參數的函數?當他們應該計算相同的值時,代碼的行爲有什麼不同?

+0

'--foo'改變'foo'的值; 'foo-1'沒有。 – IMSoP

+0

檢查了這一點:http://stackoverflow.com/questions/561588/what-is-more-efficient-i-or-i –

+1

被發現的另一件事情是,你如果部分多單可以運行,因爲你的天堂」 t used elseif – IMSoP

回答

7
solve(string, --open, closed, ++index); 

實際上改變open是一個比以前少了,這使得在下次使用的open略低於作用於值1小於過去。

solve(string, open-1, closed, ++index); 

...,另一方面將open-1傳入求解方法,但是不是更改爲open,所以在稍後的語句中使用它時未改變。

0

實際上--x是預減量操作將總是相同x=x-1;

即減小量X 1的第一和然後分配x的值遞減至x。

因此,當我們執行--x時,x值肯定會改變。

x-1只是一個操作,我們正在做的x和操作是減去。

這裏我們將這個結果分配給接收這個調用的方法中的一些參數。但它不會自動重新分配給x。

所以x-1永遠不會等於x=x-1;,因此x保持不變,只有接收器獲得減法值。

在上面的語句因此

solve(string, --open, closed, ++index); 

,預減量上open執行。

所以它與open=open-1;相同,因此開放值發生了變化。

solve(string, open-1, closed, ++index); 

上面的語句從open減去1並傳遞subtratced值方法。

其作爲receiveing_variable_in_method_definition = open-1但打開同一沒有改變。

相關問題