【发布时间】: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 的方法。元素包含在第一个元素之前的其他元素的列表。这个列表可能包含几个元素,所以它必须遍历每个人。
-
您的第一个问题是人们通常会使用递归或循环作为解决某些问题的迭代方法——而不是两者兼而有之。你的第二个问题是,当你使用递归时,你需要一些终止条件来处理没有任何东西可以递归的情况。