Ayb*_*erk 3 java pre-increment
我写了一个代码来打印所有有效的n对括号组合.但是,在我第一次尝试时,算法输出所有组合两次,即.代码是:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我花了很多时间才能看出出了什么问题.我认为代码进入最后一个if分支比它应该更多.然后,在尝试不同的事情时,我意识到了变化
solve(string, --open, closed, ++index);
Run Code Online (Sandbox Code Playgroud)
至
solve(string, open-1, closed, ++index);
Run Code Online (Sandbox Code Playgroud)
改变了结果.这导致了一个java.lang.ArrayIndexOutOfBoundsException.最后,我用相应的算术运算(例如,++indexto index+1)替换了所有预增量操作,并且代码正确运行.
我的问题是,不应该--open和open-1计算和发送相同的值作为参数传递给函数?为什么代码在计算相同值时表现不同?
solve(string, --open, closed, ++index);
Run Code Online (Sandbox Code Playgroud)
实际上改变open为比之前少一个,这使得open下面的下一个使用的行为比传入的值少1.
solve(string, open-1, closed, ++index);
Run Code Online (Sandbox Code Playgroud)
...,另一方面通过open-1到解决方法,但并没有改变open,所以在后面的语句中使用时,它的使用保持不变.
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |