遞歸實現:
自己寫的遞歸:多一個賦值操作,雖然可以得到正確的結果。但是比較難以理解。
問題:沒有深刻理解遞歸返回值。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;
}
