2013-10-22 29 views
0

嘿家伙我试图通过递归生成递归的程序来获得递归的概念。我的基本算法是:Java递归地生成字符串 - 全1然后1和0

public static ArrayList<String> generateListOfAll1sStrings(int maxBits) 

终端条件:如果maxBits是1,回到最简单的情况:包含列表只是 “1”

否则: 递归调用generateListOfAll1sStrings()的下一步 - 保存返回的列表 找到该列表中最长的字符串,并创建一个新的字符串并附加“1”(使下一个最长字符串) 返回一个新列表,其中包含所有元素较短的列表以及新的字符串吨补充。

我到目前为止的代码是:

package bincomb.model; 

    import java.util.ArrayList; 

    public class BinaryCombinationGenerator { 

public static ArrayList<String> generateListOfAll1sStrings(int maxBits) { 
    String string = null; 
    ArrayList<String> listofJust1 = new ArrayList<String>(); 
    ArrayList<String> otherArray = new ArrayList<String>(); 
    int i = 1; 


    if (maxBits == 1) { 
     listofJust1.add("1"); 
     return listofJust1; 
    } 

    if (maxBits > 1) { 
     for (String string2 : listofJust1) { 
      String comp = ""; 
      if (!(comp.equals(string2))) { 
       comp = string2; 
      } 
      string = comp; 
     } 
     listofJust1.add(i, (string + "1")); 
     i++; 
     listofJust1 = BinaryCombinationGenerator.generateListOfAll1sStrings((maxBits-1)); 

     System.out.println(listofJust1); 
     return listofJust1; 
    } 

    return listofJust1; 
} 

public static void main(String[] args) { 
    generateListOfAll1sStrings(10); 
} 

} 

然而,目前,我正在返回一个IndexOutOfBoundsException。我认为我的for循环导致了这个问题,但我不确定如何去修复它。

+0

什么行引发异常 – Taylor

+0

listofJust1.add(i,(string +“1”)),当然我的主要方法行generateListOfAll1sString(10); – Ashton

+0

string = comp,这里是什么字符串变量? –

回答

0

您会在此线路收到java.lang.IndexOutOfBoundsExceptionlistofJust1.add(i, (string + "1"));

这是因为list.add(index,objects)方法尝试在索引“1”处添加对象,但数组有0个元素。

要么将​​其更改为listofJust1.add(i-1, (string + "1"));或者干脆listofJust1.add((string + "1"));

@Edit:这里:

listofJust1.add(i, (string + "1")); 

您要添加的字符串递归的电流(N)的水平,但低于你替代这次阵列:

listofJust1 = BinaryCombinationGenerator.generateListOfAll1sStrings((maxBits-1)); 

这基本上说“得到(maxBits-1)的结果,并用它代替listofJust1”因此,你正在失去你添加的内容是前面。

相反,你应该先把名单N-1级,然后添加字符串当前级别:

listofJust1 = BinaryCombinationGenerator.generateListOfAll1sStrings((maxBits-1)); 
listofJust1.add(stringForThisLevel); 

还需要rething你是如何计算“串”在级别N,没有按看起来不错。

+0

我接受了你的建议,并将其更改为listofJust1.add((string +“1”)),并且我得到了一个ArrayList,其中只有一个arrayList,其中只有一个arrayList。该程序应该每次加上1,最后一次结束,在这种情况下,应该是10这样:[1] [11] [111] [1111] [11111] [111111] [1111111] [11111111] [ 111111111] [1111111111]我试着用+“1”来添加。这怎么可以做不同? – Ashton

+0

@Dan no it“印”9x [1]。结果列表只有1个元素[1],因为在递归的每个级别,您都要创建一个带有1个元素的新列表,并将它返回递归树。 –

+0

谢谢。你给了我很多信息。 – Ashton

0

你不需要在ArrayList的索引处添加。做list.add(element)总是添加在列表的顶部。此外,您不能添加不存在的索引。当你使用0个元素实例化你的数组,并且试图在索引1处添加这个异常,因为索引1还不存在。

见ArrayList.add(INT,E):

http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#add(int,E)

其中指出它抛出ArrayIndexOutOfBoundsException异常,如果指数>尺寸()。如果你真的想索引添加,你需要list.add(i - 1, element)因为你我从1开始。