2016-11-26 4 views
-1

Ich möchte alle Kombinationen mit zwei Zuständen (1 und 0) erstellen. Wenn ich dies mit zwei for-Schleifen mache, funktioniert das. Aber wenn ich eine selbstanrufende Funktion verwende, tut es das nicht. Kann mir bitte jemand sagen warum?Alle Kombinationen erstellen Java

For-Schleifen:

public class Counter { 
    public Counter() { 
     loop(iter); 
     for (int i=0; i < 2; i++) { 
       for (int i2=0; i2 < 2; i2++) { 
        System.out.println(Integer.toString(i)+Integer.toString(i2)); 
       } 
     } 
    } 
    public static void main(String args[]){ 
     new Counter(); 
    } 
} 

Selbst Aufruf Funktion:

class Stringhelper { 
    public Stringhelper() { 
    } 
    public String getstring(String string,int beginning,int ending) { 
     if (string.length() != 0) { 
     String newstring=""; 
     for (int iter=Math.abs(beginning); iter < ending && iter < string.length(); iter=iter+1) { 
       newstring=newstring+Character.toString(string.charAt(iter)); 
     } 
     return newstring; 
     } 
     else { 
     return ""; 
     } 
    } 
} 

public class Counter { 
    public String abil=""; 
    public int iter=1; 
    public Stringhelper shelper=new Stringhelper(); 
    public void loop(int iter) { 
     for (int i=0; i < 2; i++) { 
       abil=abil+Integer.toString(i); 
       if (iter==0) { 
        System.out.println(abil); 
        abil=shelper.getstring(abil,0,abil.length()-1); 
       } 
       else { 
        loop(iter-1); 
       } 
     } 
    } 
    public Counter() { 
     loop(iter); 

    } 
    public static void main(String args[]){ 
     new Counter(); 
    } 
} 

Und mit dem Selbst Aufruf Funktion ist der Ausgang 00,01,010,011 statt 00,01,10,11

Antwort

0

Erklären Sie Ihren Code hier (ignorieren abil jetzt):

public void loop(int iter) { 
     for (int i=0; i < 2; i++) { 
       abil=abil+Integer.toString(i); 
       if (iter==0) { 
        System.out.println(abil); 
        abil=shelper.getstring(abil,0,abil.length()-1); 
       } 
       else { 
        loop(iter-1); 
       } 
     } 
    } 

Wenn iter 0 ist, wird es ihm

In der nächsten Iteration drucken, wenn es nicht gleich 0 ist, wird ein weitere Schleife erstellt, hinzugefügt, um den Stapel, wo es wieder von 0 beginnt und druckt neuen Stapel Wert abil .

Wenn Sie einen neuen Stapel erstellen, werden alle Variablen im temporären Speicher neu erstellt, bis der Code beendet wird. In diesem Fall erstellt es weiterhin Stapel und wird nie beendet. Um einen Stapel zu verlassen, verwenden Sie return.

Zusammenfassend müssen Sie mehr darüber lernen, wie Stacks und Rekursion funktionieren, um Ihr Problem zu beheben.

+0

Dank, aber können Sie bitte erklären, warum die Ausgabe lautet: 00,01,010,011 statt: 00,01,10,11 – user7185318

+0

Warum nicht das Original verwenden for-Schleife? Rekursion sollte nur in bestimmten Fällen verwendet werden, und dies ist definitiv keiner von ihnen. Es ist auch langsamer als die ursprüngliche for-Schleife. Verwenden Sie auch bessere Namenskonventionen, da es momentan sehr schwierig ist, Ihren Code zu lesen. Das Problem ist irgendwo in abil = shelper.getstring (abil, 0, abil.length() - 1); aber ich von gerade jetzt, seine extrem schwierig zu debuggen und andere Benutzer scheinen zuzustimmen, wie Sie downvoted werden – Gabrielus

+0

Also zusammenfassend: separate Funktionen in separate Methoden, benennen Sie die Variablen in einer Initiative, und nicht Lassen Sie Zeilen länger als 44 Zeichen werden – Gabrielus

0
public void loop(int iter) { 
    for (int i=0; i < 2; i++) { 
      if (i==1) { 
       abil=shelper.getstring(abil,0,iter); 
      } 
      abil=abil+Integer.toString(i); 
      if (iter==4) { 
       System.out.println(abil); 
      } 
      else { 
       loop(iter+1); 
      } 
    } 
} 

dies hat den Trick

Verwandte Themen