2016-11-26 22 views
-1

2つの状態(1と0)のすべての組み合わせを作成したいと思います。 2つのfor-loopsでこれを行うと、これは動作します。しかし、私が自己呼び出し関数を使用するとき、それはdoesntです。なぜ誰に教えてもらえますか? forループすべての組み合わせを作成するJava

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

自己呼び出し機能:

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

と自己呼び出し機能を使用して出力が00,01,010,011の代わりに、00,01,10,11

です

答えて

0

ここでコードを説明してください(今のところabilを無視してください):

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

iterが0の場合、それは印刷されます

次の反復では、0に等しくない場合、別のループが作成され、スタックに追加され、0から再び開始され、abilの新しいスタック値が出力されます。

新しいスタックを作成すると、コードが終了するまですべての変数が一時記憶域に再作成されます。この場合、スタックを作成して終了しません。スタックを終了するには、returnを使用します。

要約すると、問題を解決するためにスタックと再帰がどのように機能するかについて詳しく知る必要があります。

+0

感謝をしましたが、出力があるなぜあなたは説明してくださいすることができます:00,01,010,011の代わり:00,01,10,11 – user7185318

+0

ループのためのオリジナルを使用しないのはなぜ?再帰は特定のインスタンスでのみ使用する必要がありますが、これは最も重要なことです。また、元のforループよりも遅いです。また、より良い命名規則を使用するように、今はあなたのコードを読むことは非常に困難です。 問題はどこかにあります。 abil = shelper.getstring(abil、0、abil.length() - 1); 私は今のところ、デバッグするのが非常に難しく、他のユーザーはあなたが下降しているので同意しているようです – Gabrielus

+0

要約すると、別々のメソッドに別々の機能を分け、イニシアティブの方法で変数に名前を付け、行が44文字より長くなるようにしてください – 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); 
      } 
    } 
} 

これはトリックに

関連する問題