繁体   English   中英

Java-迭代列表递归中返回与不返回之间的区别

[英]Java- difference between return vs no return in iterated list recurssion

我正在尝试使用递归和迭代器计算链表中符合条件(如果 x > num)的项目数。 当我使用return来自调用 function (如下所示)时,它会返回它经过的项目的计数,但不会通过列表 go 但是当我不使用return并且只会直接调用if(x > num) total = 1 + nodes.Greater(); else nodes.Greater(); if(x > num) total = 1 + nodes.Greater(); else nodes.Greater(); 它遍历整个列表,但始终返回计数 0。

public static Integer nodesGreater(Node x, Integer num){ 
 Integer total = 0;  
 for(Iterator<Integer> it = list.iterator(); it.hasNext();){  
   Integer x = it.next();  
   if(x > num) return 1 + nodesGreater(it.next(), num);      
   else return nodesGreater(it.next(), num);     
 } 
 return total; 
}

例如:如果链表是1-3-8-10-12-15-20并且条件是它应该大于 8,它将返回 2 (10, 12) 而不是 4 (10, 12, 15 , 20)

你在这两种方式上都做错了。

任何一个:

  1. 使用该列表迭代器并且不递归,-或-
  2. 递归,不要使用列表迭代器

递归是遍历项目列表的一种策略。 迭代器是另一个。 你正在尝试两者兼而有之。 因此,这是行不通的。

如果要递归,那么算法和所有递归算法一样:

  1. 检查您是否被要求在边缘情况下进行操作。 如果这样做,请返回明显的答案而不递归。 据推测,没有“下一个”节点的节点就是这种边缘情况,您只需直接返回 1(或可能为 0;取决于您如何设计链表)。
  2. 否则,只为您自己的元素进行计算(大概,这是一个常数:您自己的节点对答案的贡献大小为“1”,因此为“1”),在数据结构的已知更简单的变体上调用自己(在你之后的节点上调用 nodesGreater,保证更接近最后一个节点的边缘情况),然后合并结果。
  3. 而已。 没有循环。

所以,像:

if (x.next == null) return 1;
return 1 + nodesGreater(x);

或者,如果您想进行迭代,则只需遍历每个元素,找出您所在节点的答案,并将其与计数器变量合并:

int sum = 0;
for (int elem : elems) sum++;
return sum;

注意:它是int ,而不是Integer Integer '有效',但那是整数的 object 引用包装器,你不想要它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM