zoukankan      html  css  js  c++  java
  • 二分查找递归和非递归方法分析

    递归实现:

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

    问题:没有深刻理解递归返回值。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;
    }
    

      

  • 相关阅读:
    Javascript文件加载:LABjs和RequireJS
    【译】前端开发者的基本要求
    正则基础之——NFA引擎匹配原理
    JavaScript 设计模式 安全沙箱模式
    jsdoc_toolkit
    JS判断手机浏览器
    JavaScript:Object.prototype.toString方法的原理
    FullCalendar 官方文档翻译2
    浏览器缓存机制
    jQuery.extend 函数详解
  • 原文地址:https://www.cnblogs.com/huiandong/p/10983205.html
Copyright © 2011-2022 走看看