二分查找递归和非递归方法分析

递归实现:

自己写的递归:多一个赋值操作,虽然可以得到正确的结果。但是比较难以理解。

问题:没有深刻理解递归返回值。return会在递归调用到最后,在递归结束的地方,会将返回值一层一层返回给方法,直到返回最后一层也就是方法不进行递归演算的动作时。

总结:首先要记住递归有递归头和递归体,递归头可能有多重情况。递归体也可能有多重情况。

        public static int binarySearch(int[] arr,int n){
			int low=0;
			int high=arr.length-1;
			return binarySearch2(arr,low,high,n);
	}
	public static int binarySearch2(int[] arr,int low,int high,int n){
		int z=(low+high)/2;
		int i=-1;
		if(low<=high){
			if(arr[z]==n ){
				return i=z;
			}else{
				if(arr[z]>n){
					high=z-1;
				}else if(arr[z]<n){
					low=z+1;
				}
				return binarySearch2(arr,low,high,n);
			}
		}
		return i;
	}

网友的递归:

没有找到对应值,递归结束会走对应的递归头

找到对应值,递归结束走对应递归头

         public static int binarySearch(int[] arr,int low,int high,int n){
		int mid=(low+high)/2;
		if(low>high){
			return -1;
		}
		if(arr[mid]==n){
			return mid;
		}else if(arr[mid]>n){
			return binarySearch(arr,low,mid-1,n);
		}else{
			return binarySearch(arr,mid+1,high,n);
		}
	}

非递归实现:

总结:第一次写low+high/2的地方没有加括号,结果导致数组索引越界:3,正确的写法(low+high)/2 

public static int binarySearch(int[] a,int low,int high,int n){
	while(low<=high){
		int mid=(low+high)/2;
		if(a[mid]==n){
			return mid;
		}else if(a[mid]>n){
			high=mid-1;
		}else{
			low=mid+1;
		}
	}
	return -1;
}

  

原文地址:https://www.cnblogs.com/huiandong/p/10983205.html