创建所有组合Java

时间:2016-11-26 17:40:32

标签: java combinatorics

我想创建具有两个状态(1和0)的所有组合。 如果我用两个for循环这样做,这是有效的。但是,当我使用自我调用函数时,它不会。有人能告诉我原因吗?

For-Loops:

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

2 个答案:

答案 0 :(得分:1)

在这里解释你的代码(暂时忽略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。

总之,您需要了解有关堆栈和递归如何工作的更多信息,以便解决您的问题。

答案 1 :(得分: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);
          }
     }
 }

这就是诀窍