一些成功处理后递归方法越界错误

时间:2013-11-14 17:01:57

标签: java recursion

我应该写一个递归方法,删除arrayList末尾的数字的重现。我觉得我已经用所有可能的错误覆盖了我的基础,但是一旦它第三次处理我就会出现一个出界的错误。我似乎无法弄清楚为什么我会出现越界错误。似乎我的所有计数都保持在正确的位置,并且我有一个if语句,一旦计数器位置相等就使用递归,这是我认为错误消息的位置。

任何见解都会有所帮助,需要从错误中吸取教训。递归也不是我的强项。

编辑:这是清单; [100,200,200,300,400,300,100,500,500,400,100,400,100,100]

public static void deleteDuplicateValues(ArrayList<Integer> list, int decreasingCounter, int searchingVal, int outsideCounter)
  {
    int searchingValue = list.get(searchingVal);


    if (outsideCounter < (list.size()-1))
    {

      if (searchingValue == list.get(list.size()-1-decreasingCounter)) //finds
      {
        System.out.print (searchingValue + "   FOUND at position" + (list.size()-1-decreasingCounter) + "\n");
        list.remove(list.size()-1-decreasingCounter);

        deleteDuplicateValues(list, decreasingCounter,searchingVal+1, outsideCounter+1);

      }
      else
      {
        if (list.size()-1-decreasingCounter == outsideCounter) //gets to end without finding double
        {//After searching x amount of times, they will equal eachother if not found.
          //outsideCounter only increments when found or end of processing. 
          decreasingCounter = 0;
          deleteDuplicateValues(list, decreasingCounter,searchingVal+1, outsideCounter+1); //goes to next position
        }

        else 
        {
          System.out.print("executed");
          deleteDuplicateValues(list, decreasingCounter+1, searchingVal, outsideCounter); //values UP1


        }
      }
    }

2 个答案:

答案 0 :(得分:0)

我找错了你想要删除重复项吗?如果是这种情况,为什么不使用java.util.Set ??

的任何实现
Set<Integer> set = new HashSet<Integer>(list);
list.clear();
list.addAll(set);

我无法完全理解索引和计数的全部内容

编辑: 我想我明白了。当你得到这个if语句

if (searchingValue == list.get(list.size() - 1 - decreasingCounter)) {
    System.out.print(searchingValue + "   FOUND at position" + (list.size() - 1 - decreasingCounter) + "\n");
    list.remove(list.size() - 1 - decreasingCounter);

    deleteDuplicateValues(list, decreasingCounter, searchingVal + 1, outsideCounter + 1); <<-- HERE!
}

删除一个元素,即使这样,当你进行递归调用时,你会通过删除元素来增加serachingValue,但是你已经移动了。我清楚了吗?

答案 1 :(得分:0)

您可以简化不变量。方法参数中所需要的只是整数列表和要删除的数字的值,只有两个参数。我不明白为什么你需要所有其他人 - 尝试简化它你会破解它。