递归(一)

  • 最近在学习《算法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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值