这段代码究竟需要做什么?

时间:2017-01-31 07:13:00

标签: java algorithm

以下是打印n等于3的二进制数的所有可能性的代码:

public class Main {

    static void binary(int N, int[] A) {
        if(N < 1)
            System.out.println(Arrays.toString(A));
        else
        {
            A[N-1] = 0;
            binary(N-1,A);
            A[N-1] = 1;
            binary(N-1,A);
        }
    }

    public static void main(String[] args) {
        int[] a = new int[3];
        binary(3,a);
    }
}

代码完美无缺。我能够看到有两个递归调用,我无法理解这是如何工作的。为什么需要两个递归调用?

2 个答案:

答案 0 :(得分:3)

每增加一位,将可能值的数量乘以2次。这意味着你有

            0        and         1        - first bit
then    00     10    and     01     11    - second bit
then 000 100 010 110 and  001 101 011 111 - third bit and so on

因此,对于每个调用,您应该再处理两个以处理下一位的可能值(0和1)

答案 1 :(得分:1)

要获得某些长度的所有可能的二进制表示,可以将其视为值为0或1的位数组。

递归可以通过以下一厢情愿来解释 - 假设我们可以生成长度为N-1的所有二进制表示,我们如何生成长度为N的所有二进制表示?答案 - 在所有N-1表示的开头附加0,并将该列表添加到通过在所有N-1表示的开头附加1创建的列表。通过进行两次方法调用可以获得这种一厢情愿的想法。

让我们了解这个程序对N = 2的操作方式:我们会将数组的值注意为[?,?]:

  1. N = 2,A = [?,0],调用二进制(1,A)
  2. N = 1,A = [0,0],调用二进制(0,A)
  3. N = 0,打印[0,0]
  4. N = 1,A = [1,0]调用二进制(0,A)
  5. N = 0,打印[1,0]
  6. N = 2,A = [?,1],调用二进制(1,A)
  7. N = 1,A = [0,1],调用二进制(0,A)
  8. N = 0,打印[0,1]
  9. N = 1,A = [1,1]调用二进制(0,A)
  10. N = 0,打印[1,1]