在初学算法中对递归的理解
这篇文章是我在初学算法递归时的一些总结:
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还是直接调递归方法还是使用一个值来存储还要视具体情况而定。