- 最近在学习《算法4》一书。在P103习题的练习1.3.28
使用递归方法编写一个
max()
,接受一条链表的首结点作为参数,返回链表中键最大的节点的值(假设所有键均为正整数,如果链表为空则返回0)。
- 很多人可能和我之前的想法一样—认为递归很简单,不就是自己调用自己嘛。但是当接触到实际问题的时候,递归问题把我搞的一头雾水。到底什么时候返回递归表达式,什么时候返回值。
- 编写递归代码是最重要的有一下三点
1.递归总有一个最简单的情况—方法的第一条语句总是包含return的条件语句
2.递归调用总是去尝试解决一个规模更小的问题,这样才能收敛到最简单的情况。
3.递归调用的父问题和尝试解决的子问题之间不应该有交集
- 回到练习题
//Recursive递归版max()
public int max_recur(Node headNode){
Node curr_node = headNode.next;
if(curr_node.next == null) return 0;
return max_recur(curr_node,0);
}
//问题结束的标志是扫描到尾节点(该节点item == null)
//问题真正需要返回的值是max,每一次递归得到的max需要与下一个节点进行对比,
//所以这里想到了max作为参数传递给下一次递归
//递归中必定是有一行终止,并返回真正需要的值,而不是递归表达式,毕竟递归就是用来计算结果的
//本题中的子问题应该是将节点的item与max比较,保存max,并向后扫描。
public int max_recur(Node headNode,int max){
Object item = headNode.item;
if(item == null) return max;
if(max < (int)item) max = (int)item;
return max_recur(headNode.next,max);
}