二分查找遞歸和非遞歸方法分析


遞歸實現:

自己寫的遞歸:多一個賦值操作,雖然可以得到正確的結果。但是比較難以理解。

問題:沒有深刻理解遞歸返回值。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;
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM