我写了一段代码来打印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