2017-01-31 190 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)下位