使用Recursion打印[0,0,0,0]到[9,9,9,9] I的数组

时间:2017-07-23 17:21:22

标签: java recursion

我只想使用递归从[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。然后,它运作良好。

但我真的很困惑,为什么呢? ++bitbit+1都要将该位增加1,为什么它不适用于++bit,它适用于bit+1

非常感谢。

2 个答案:

答案 0 :(得分:1)

++bitbit + 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);
        }
}

有几个问题:

  1. 你混合循环和复发。

  2. 错误的数组大小

  3. 错误的数组值

  4. 错误打印if-case

  5. 功能退出错误。

  6. 此代码显示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);
            }
    }