2014-05-03 56 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但打开同一没有改变。

相关问题