【问题标题】:How to use recursive methods with lists如何在列表中使用递归方法
【发布时间】:2014-12-19 10:20:06
【问题描述】:

我在思考如何使用递归方法来计算列表中的元素数量,然后跳转到该列表中的每个元素并计算它们存储了多少元素时遇到了一个小问题。我会尽量概括这一点,但我会使用我自己的一个例子。 我拥有的数据结构是一个数组列表,我在其中存储了元素。所有这些都有一个数组列表,其中指向该元素的元素由前面的元素 ID 存储。所以:元素->列表->ID(整数,即2)->元素nr.2。我想通过递归方法计算每个元素有多少前面的元素。我尝试了几个选项,例如将所有前面的元素存储在一个新列表中,然后将其大小作为前面元素的数量,以及使用 counter-int。到目前为止我得到的最接近的是使用这种方法(id 是一个数字,总是 +1 它位于包含它的数组列表中的索引):

private int getPredecessorCount(int id){
    for(int i:elementList[id-1].predecessors){
        return 1+getPredecessorCount(i);
    }
    return 0;
}

这给了我所有元素的正确答案,其中元素包含只有一个元素的列表。我无法让它与具有超过 1 个前置元素的列表的元素一起使用。有任何想法吗?

我也试过了:

    private int getPredecessorCount(int id, int counter) {
    if(!elementList[id-1].predecessors.isEmpty()){
        for(int i : elementList[id-1].predecessors){
            counter+=getPredecessorCount(i, counter);
            counter++;
        }   
    }
    return counter;

这给了我与前一个相同的结果,但是前一个给我的前辈太少,而对于包含更大列表的那些,这个给我太多了。

【问题讨论】:

  • 您的for 循环永远不会查看多个前任,因为它所做的第一件事就是离开方法(使用return 语句)。你真的想在for 循环中做什么,添加所有getPredecessorCounts?
  • 一个带有循环的递归方法是一个奇怪的野兽。
  • 我不清楚你的列表包含什么,以及你在寻找什么答案。
  • 如果我不清楚任何地方,我很抱歉。它包含对象(我在这个问题中标记为“元素”)正如 ajb 所说,我正在寻找一种添加所有 getpredecessorsCounts 的方法。元素包含在第一个元素之前的其他元素的列表。这个列表可能包含几个元素,所以它必须遍历每个人。
  • 您的第一个问题是人们通常会使用递归或循环作为解决某些问题的迭代方法——而不是两者兼而有之。你的第二个问题是,当你使用递归时,你需要一些终止条件来处理没有任何东西可以递归的情况。

标签: java recursion arraylist


【解决方案1】:

好的,让我们概括一下...

private int counter(List<Element> items) {

   int count = 0;
   for (Element item: items) {
       count ++; // for the item counting
       if (item.holdsElements) { // for inner elements
           count = count + counter(item.getElements());
       }
   }

   return count;
}

我特意写了这个方法的简化版本来说明应该如何做。 Null 检查和其他边缘情况会被有意忽略。

所以你计算一个列表中的所有元素......好吧,很简单,如果一个元素包含内部项目,你就去计算那些。然后返回绝对计数。

您的问题是,一旦您从第一个元素中获得计数,您就返回了结果,而不考虑其他元素。使用调试器可以轻松发现问题。

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 2020-07-20
    • 2014-02-12
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多