2017-01-31 7 views
2

Hier ist der Code für das Drucken aller Möglichkeiten der Binärzahl für n gleich 3:Wie genau muss dieser Code tun?

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

Der Code perfekt funktioniert gut. Ich konnte sehen, dass es zwei Rekursionsaufrufe gibt, ich konnte nicht verstehen, wie das funktioniert. Warum gibt es zwei Rekursionsanrufe?

+0

Die zwei rekursive Aufrufe alle möglichen Bit-Konfiguration in nötig sind, um zu erstellen jede Position. Da die einzigen Werte, die ein Bit annehmen kann, "0" oder "1" sind, sind dafür nur zwei Aufrufe erforderlich. Wenn Sie den Code nachverfolgen, wird Ihnen dies klar. –

Antwort

1

Um alle möglichen binären Darstellungen von einiger Länge zu erhalten, können Sie es als ein Array von Bits mit dem Wert 0 oder 1

Die Rekursion mit folgendem Wunschdenken kann erklärt betrachten - vorausgesetzt, wir alle binären erzeugen können Darstellungen der Länge N-1, wie erzeugen wir alle binären Darstellungen der Länge N? Die Antwort - füge am Anfang aller N-1-Darstellungen 0 an und füge diese Liste zu derjenigen hinzu, die durch Anhängen von 1 am Anfang aller N-1-Darstellungen erzeugt wurde. Dieses Wunschdenken wird durch Ausführen der beiden Methodenaufrufe erhalten.

Lets folgen, wie dieses Programm für N arbeitet = 2: Wir werden die Werte des Arrays beachten als [?,?] [?, 0]

  1. N = 2, A = rufen binäre (1, A)
  2. N = 1, A = [0, 0], binary nennen (0, A)
  3. N = 0, drucken [0,0]
  4. N = 1, A = [ 1, 0] Aufruf Binär (0, A)
  5. N = 0, Druck [1,0]
  6. N = 2, A = [?, 1], Aufruf Binär (1 , A)
  7. N = 1, A = [0, 1], binary nennen (0, A)
  8. N = 0, drucken [0,1]
  9. N = 1, A = [1, 1] nennen binären (0, A)
  10. N = 0, drucken [1,1]
3

Jedes zusätzliche Bit multipliziert die Anzahl der möglichen Werte 2 mal. es bedeutet, dass Sie

haben
  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 

für jeden So rufen sollten Sie zwei weitere verarbeiten beide möglichen Werte machen (0 und 1) des nächsten Bit