二分查找递归和非递归方法分析
递归实现:
自己写的递归:多一个赋值操作,虽然可以得到正确的结果。但是比较难以理解。
问题:没有深刻理解递归返回值。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; }