在初学算法中对递归的理解(自己用)

在初学算法中对递归的理解

这篇文章是我在初学算法递归时的一些总结:
1.有返回值类型的,对于能够用if-else完全覆盖的递归:
这种代码,由于可以用if-else覆盖所有情况,可以基本确定不会回溯,所以直接return就可以,只是最后如果找不到会什么也不显示。
(1)二分查找

public static int bsinarySearch2(int[] array,int n,int left,int right){
		int l=left;
		int r=right;
		int mid=(left+right)/2;
		if(array[mid]==n){
			return mid;
		}
		else if(array[mid]>n){
			return binarySearch2(array, n, left, mid-1);
		}
		else{
			return binarySearch2(array, n, mid+1, right);
		}
	}

(2)二叉排序树查找
这里和上面一样,都是没有回溯一路走到底的。

public Node1 sortSearch(int a){
		if(this.no==a){ 
			return this;
		}
		else if(this.no<a){
			if(this.right!=null){
				return this.right.sortSearch(a);
			}
			else{
				return null;
			}
		}
		else{
			if(this.left!=null){
				return this.left.sortSearch(a);
			}
			else{
				return null;
			}
		}
	}

总结:这种有返回值类型并且能够通过if-else列举完的,可以直接使用return。
2.无返回值类型的递归
(1)普通二叉树查找(返回全部查找到的位置)
下面这种查找由于在外部定义了一个list,不会由于回溯而将list重置,可以用于查找返回多个相同值。这里可以直接调用递归方法。

static List<Node> list=new ArrayList<Node>();
	public static void search(int age,Node a){
		if(a.left!=null){
			if(a.age==age){
				list.add(a);
			}
			else{
				search(age, a.left);
			}
		}
		if(a.age==age){
			list.add(a);
		}
		if(a.right!=null){
			if(a.age==age){
				list.add(a);
			}
			else{
				search(age, a.right);
			}
		}
	}

(2)特别注意:普通二叉树查找(返回第一个查找到的位置)

public Node1 search(int a){
		Node1 save=null;
		if(this.left!=null){
			if(this.left.no==a){
				return this.left;
			}
			else{
				save=this.left.search(a);标记行
//一:将此行替换成return this.left.search(a)会返回null,因为return会将第一个接收到(return)的值直接返回,
//这样不会触发回溯,比如左子树只有一个节点而查找值在右子树,则会直接返回null。
//二:也不能直接this.left.search(a),这样即使查找到了在后续回溯过程中save又变回了null,最终结果是null。
			}
		}
		if(save!=null){
			return save;
		}
		if(this.no==a){
			return this;
		}
		if(this.right!=null){
			if(this.right.no==a){
				return this.right;
			}
			else{
				save=this.right.search(a);
			}
		}
		return save;
	}

这部分需要仔细思考解决方案。首先,它有返回值;其次,他没办法通过if-else将全部情况列出;再者,这里不使用方法外部定义的List或save。也就是说,这里需要回溯,在必须要返回一个值的情况下可以考虑使用一个save存储值。在标记行尝试三种方法:一:将此行替换成return this.left.search(a)会返回null,因为return会将第一个接收到(return)的值直接返回,这样不会触发回溯,比如左子树只有一个节点而查找值在右子树,则会返回null。
二:也不能直接this.left.search(a),这样即使查找到了在后续回溯过程中save又变回了null,最终结果是null。三:正确代码,如上代码块。

这次总结主要针对有无返回值以及是否能回溯进行了总结,实际应用中,用return还是直接调递归方法还是使用一个值来存储还要视具体情况而定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值