2017-03-15 36 views
2

我讓我的方法的計算器錯誤,我不知道爲什麼,因爲我遞歸問題初學者簡單的java

if (index < elements.size())

行確保它不是一個無限遞歸調用。這是我的代碼到目前爲止。

private boolean checkIfIncreasing(ArrayList<T> elements, int index){ 
    index = 0; 
    boolean currentReturnVal = false; 

    //element at position 0 of the passed in array 
    T objAtIndex = elements.get(index); 

    //element at position 1 of the passed in array 
    T objAtNextIndex = elements.get(index + 1); 

    //if the size is 1 then just return true bc its the only element in there 
    if (elements.size() == 1){ currentReturnVal = true;} 

    if (index < elements.size()){ //takes care of non infinite "looping" 

    //checks to see if obj at index 0 is less than or equal to obj 1 
    if (objAtIndex.compareTo(objAtNextIndex) <= 0){ 
     currentReturnVal = true;} 

    checkIfIncreasing(elements, index++); 
    if (objAtIndex.compareTo(objAtNextIndex) >= 0){ 
     return false; } 
    } 
    return currentReturnVal; 
} 

我不知道爲什麼我收到錯誤,我不知道如何從結構上修復它。

+6

你每次都設置索引爲0之前增加索引。所以除非'elements.size()'是0,它永遠不會停止。 – marisbest2

回答

1

保持簡單和短。

private boolean checkIfIncreasing(List<T> elements, int index) { 
    if (elements.size() < 2 || index + 1 == elements.size()) 
     return true; 
    if (elements.get(index).compareTo(elements.get(index+1)) < 1) 
     return checkIfIncreasing(elements, index+1); 
    return false; 
} 

這應該與索引0調用。

+0

謝謝!非常緊湊。 – emmynaki

0

我不知道爲什麼我收到錯誤,我不知道如何在結構上修復它。

你在方法的每次調用重置index0在這種條件if (index < elements.size())是永遠真實的,除非elements.size()是0在這種情況下if block裏面的代碼將在每個調用繼續執行checkIfIncreasing(elements, index++);反覆方法並最終會拋出StackOverflowException

防止StackOverflowException簡單地刪除此行:index = 0;

0

在您設定的指標爲0。

所以,即使你之前遞歸增加它的方法的第一行,它總是被設置爲0

相反,你可能想要的是一個helper方法,像這樣:

private boolean checkIfIncreasing(ArrayList<T> elements) { 
    return checkIfIncreasing(elements, 0); 
} 

,然後刪除第一行中的checkIfIncreasing(ArrayList<T> elements, int index)方法

這種技術被稱爲超載 方法。

+0

也謝謝你!每天學習這麼多。 – emmynaki

1

你需要傳遞給你的遞歸函數

private boolean checkIfIncreasing(ArrayList<T> elements, int index){ 
// check if array has at least 2 elements first, ot you will get an exception 
    if (elements.size() <=1 || index >= elements.size()){ return true;} 

    //checks to see if obj at index 0 is less than obj 1 
    if (objAtIndex.compareTo(objAtNextIndex) < 0){ 
     // if any obj[x] is smaller than obj[x+1] 
     return false; 
    } 
// here element index and index+1 are either in incremental order or equal 
    return checkIfIncreasing(elements, ++index);  
} 
+0

非常感謝你! – emmynaki