2013-10-22 26 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開始。