2016-11-26 6 views
-1

Я хочу создать все комбинации с двумя состояниями (1 и 0). Если я делаю это с двумя контурами, это работает. Но когда я использую функцию самозапуска, это не делает. Кто-нибудь может сказать мне, почему, пожалуйста?Создать все комбинации 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(); 
    } 
} 

Self-Вызов функции:

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

Объясняя свой код здесь (игнорировать Абиль сейчас):

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

Когда ИТЭР 0 он будет печатать его

В следующей итерации, когда он не равен 0, то другой цикл создается, добавляется в стек, где он начинается снова с 0, и выводит новое значение стека Абиль в ,

Когда вы создаете новый стек, он воссоздает все переменные во временном хранилище, пока код не выйдет. В этом случае он продолжает создавать стеки и никогда не выходит. Чтобы выйти из стека, используйте return.

Таким образом, вам нужно узнать больше о том, как стеки и рекурсия работают, чтобы исправить вашу проблему.

+0

спасибо, но можете ли вы объяснить, почему выход: 00,01,010,011 вместо: 00,01,10,11 – user7185318

+0

Почему бы не использовать оригинальный цикл? Рекурсия должна использоваться только в определенных случаях, и это определенно не является одним из них. Он также медленнее, чем исходный для цикла. Кроме того, используйте лучшие соглашения об именах, так как сейчас очень сложно прочитать ваш код. Проблема находится где-то в 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); 
      } 
    } 
} 

это сделал трюк