为了学习递归并编写自定义链表(而不是java.util
中的LinkedList
),我尝试创建递归max()
方法如下。我费了一点劲,但最后还是成功了。然而,我不确定这是否是正确的方法(或最简单的方法)。首先,我对基本情况不太确定。我已经将基本情况设置为列表中的最后一个节点。这是应该做的吗?请告诉我如何写一个简单的递归最大化方法。
class ListNode{
int item;
ListNode next;
}
class RecursiveMax{
public static int max(ListNode node,int maxValue){
//is this the base case ?
//if last node reached return the current maxValue
if(node==null){
return maxValue;
}else{
int v = node.item;
if(v > maxValue){
return max(node.next,v);
}else{
return max(node.next,maxValue);
}
}
}
public static void main(String[] args) {
ListNode a = new ListNode();
a.item = 11;
ListNode b = new ListNode();
b.item = 9;
ListNode c = new ListNode();
c.item = 21;
ListNode d = new ListNode();
d.item = 17;
a.next = b;
b.next = c;
c.next = d;
System.out.println("max value in linkedlist="+max(a,0));
}
}
链接列表a-b-c-d
(值为11,9,21,17
)输出为
max value in linkedlist=21
好吧,你开始搜索0
作为main
的当前最大值。当所有值都是负时会发生什么?
我认为你可以做得更好。用两个参数private
调用max方法。然后,暴露只接受ListNode
的max
。
public static int max(ListNode node) {
//max value is its value.
if (node == null) {
return Integer.MIN_VALUE;
}
return max(node, node.item);
}
private static int max(ListNode node,int maxValue){
int v = node.item;
if(v > maxValue){
return max(node.next,v);
}else{
return max(node.next,maxValue);
}
}
最后,在main
中,您只需调用max(a);
首先,不要使你的类是静态的。darijan的建议很好,我更喜欢抛出异常而不是返回任何设定值,因为返回甚至整数。MIN_VALUE是不明确的。您不知道这是最大值,还是列表中没有项。
所以我建议:
public class linklist {
class ListNode {
int item;
ListNode next;
}
ListNode root;
public linklist() {
this.root = null;
}
public void add(ListNode node){ /*...*/}
public int getMax() {
if (root == null)
throw new NullPointerException("No items in list");
return getMaxFrom(this.root, this.root.item);
}
int getMaxFrom(ListNode node, int maxValue) {
if (node == null)
return maxValue;
else {
return getMaxFrom(node.next, Math.max(node.item, maxValue));
}
}
}
从纯粹的技术角度来看,您所拥有的是好的。第一个评论中建议的改进是我想做的,但这只会稍微提高可读性。
遍历列表查找最大的值使用交互会简单得多。事实上,我从来没有递归过一个列表。对于迭代,您可以使用iterator
, for
(简单和增强),while
和do
(可能还有其他一些)。
如果你想学习递归,我建议你构建一个树状结构,并研究它。XML是树形结构的一个很好的例子,它将使您暴露于XML处理,而您最终将在某一天做这些处理。
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class RecursionUtils extends Object {
public static final int findMaxRecursively(List<Integer> numbers) {
if (numbers.size() > 0) {// terminating condition... if there are no
// elements remaining in the list then
// return 0..
int num1 = numbers.remove(0); // remove the first element of the
// list, thus in the process we
// truncate the list by one element.
int num2 = findMaxRecursively(numbers); // find the max from the
// rest of the list..
return num1 > num2 ? num1 : num2;
} else
return 0;
}
public static void main(String[] args) {
List<Integer> numbers = new LinkedList<>();
numbers.addAll(Arrays
.asList(new Integer[] { -1, -2, -3, 0, 6, 5, 3, 2 }));
System.out.println("The entered list is :");
System.out.println(numbers);
System.out.println("nThe max element is : "
+ findMaxRecursively(numbers));
}
}