2017-01-31 154 views
2

这里是打印二进制数的所有可能性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); 
    } 
} 

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

+0

两个递归调用都需要在创建每个可能的位配置每个位置。由于唯一的值可能是'0'或'1',这就是为什么只需要两个这样的调用。如果你通过代码追踪,这将变得清晰。 –

回答

1

为了得到一些长度的所有可能的二进制表示,你可以把它看成一组位值为0或1。

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

允许遵循怎样该程序进行N = 2进行操作:我们将注意到阵列的值[,?]:[?,0]

  1. N = 2,A =,呼叫二进制(1,A)
  2. N = 1,A = [0,0],呼叫二进制(0,A)
  3. N = 0,印刷[0,0]
  4. N = 1,A = [ 1,0] call binary(0,A)
  5. N = 0,print [1,0]
  6. N = 2,A = [?,1],call binary中的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]
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)下位