我只想使用递归从[0,0,0,0]到[9,9,9,9]打印一个数组。 首先,我编写了如下代码:
public class PrintNumber {
public static void main(String[] args) {
int N = 4;
int[] number = new int[N];
PrintNumber printNumber = new PrintNumber();
printNumber.printNum(number,0);
}
public void printNum(int[] number, int bit) {
if (bit == number.length ) {
System.out.println(Arrays.toString(number));
return;
}
for (int i = 0; i < 10; i++) {
number[bit] = i;
/******** something goes wrong here ********/
printNum(number, ++bit);
/******** something goes wrong here ********/
}
}
}
正如您所看到的,没有太多代码,但它没有用。
所以我调试了我的代码,我发现++bit
(代码的最后一行)应该写成bit+1
。然后,它运作良好。
但我真的很困惑,为什么呢? ++bit
和bit+1
都要将该位增加1,为什么它不适用于++bit
,它适用于bit+1
?
非常感谢。
答案 0 :(得分:1)
++bit
和bit + 1
之间存在差异。表达式++bit
表示基本上是bit = bit + 1
*。所以你的路线就变成了。
printNum(number, bit = bit + 1);
因此变量bit
的实际值正在发生变化,并且由于您在循环中调用它,因此值将继续增加,这是不希望的。最终,当ArrayIndexOutOfBoundsException
对于数组来说太大时,会得到bit
。
*它实际上可能是一个更有效的JVM指令,但在语义上,它应该是等效的。
答案 1 :(得分:0)
这是一个可行的解决方案。
import java.util.Arrays;
public class TestTest {
private static int N = 4;
private static int MAX = 10;
public static void main(String[] args) {
int[] number = new int[N];
TestTest printNumber = new TestTest();
printNumber.printNum(number,0);
}
public void printNum(int[] number, int bit) {
System.out.println(Arrays.toString(number));
if (bit == MAX ) {
return;
}
for (int i = 0; i < N; i++) {
number[i] = bit;
}
printNum(number, ++bit);
}
}
有几个问题:
你混合循环和复发。
错误的数组大小
错误的数组值
错误打印if-case
功能退出错误。
此代码显示stackoverflow异常。但它适用于N = 3
:
public class TestTest {
private static int N = 3;
private static int MAX = 10;
public static void main(String[] args) {
int[] number = new int[N];
TestTest printNumber = new TestTest();
printNumber.printNum(number);
}
public void printNum(int[] number) {
System.out.println(Arrays.toString(number));
// if (bit == MAX) {
// return;
// }
boolean exit = true;
for (int i = 0; i < N; i++) {
if (number[i] != MAX - 1) {
exit = false;
}
}
if (exit) {
return;
}
number[N - 1]++;
for (int i = N - 1; i >= 0; i--) {
if (number[i] == MAX) {
if (i > 0) {
number[i - 1]++;
number[i] = 0;
}
}
}
printNum(number);
}
}
循环解决方案:
public class TestTest {
private static int N = 4;
private static int MAX = 10;
public static void main(String[] args) {
int[] number = new int[N];
TestTest printNumber = new TestTest();
// printNumber.printNum(number);
printNumber.printNumLoop(number);
}
private void printNumLoop(int[] number) {
while(true) {
System.out.println(Arrays.toString(number));
number[N - 1]++;
for (int i = N - 1; i >= 0; i--) {
if (number[i] == MAX) {
if (i > 0) {
number[i - 1]++;
number[i] = 0;
}
}
}
boolean exit = true;
for (int i = 0; i < N; i++) {
if (number[i] != MAX - 1) {
exit = false;
}
}
if (exit) {
System.out.println(Arrays.toString(number));
break;
}
}
}
public void printNum(int[] number) {
// if (bit == MAX) {
// return;
// }
boolean exit = true;
for (int i = 0; i < N; i++) {
if (number[i] != MAX - 1) {
exit = false;
}
}
if (exit) {
return;
}
number[N - 1]++;
for (int i = N - 1; i >= 0; i--) {
if (number[i] == MAX) {
if (i > 0) {
number[i - 1]++;
number[i] = 0;
}
}
}
printNum(number);
}
}