2017-03-15 73 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