黑马程序员技术交流社区

标题: 折半查找问题,用for语句以后为什么不能返回MIN的值(已解决 [打印本页]

作者: 陆强强    时间: 2012-4-24 16:10
标题: 折半查找问题,用for语句以后为什么不能返回MIN的值(已解决
本帖最后由 陆强强 于 2012-4-25 14:16 编辑

public static int getSearch(int[] arr,int key)
        {
                for (int min = 0,max = arr.length-1,mid = (min+max)/2;min<=max ;mid = (min+max)/2)
                {
                        if (key<arr[mid])
                                max=mid-1;
                        else if (key>arr[mid])
                                min=mid+1;
                        else
                                return mid;
                }
                        return min;//不能返回min或max?

作者: 黑马-刘昌文    时间: 2012-4-24 16:30
你整个循环 就一个return -1 语句,当进入到相应的条件后,应该有相应的 return值!
作者: 胡奎    时间: 2012-4-24 16:48
你的MIN,MAX定义在for语句里面,而return在外边,没发获取。
作者: 邱俊杰    时间: 2012-4-24 17:02
首先你先明确函数返回的是什么、  返回的是你查找的结果。而不是什么最大值最小值
min 和max只是循环里的条件而已、mid才是你需要查找的数。
作者: 李月    时间: 2012-4-24 17:09
变量有自己的作用域。对于for来讲:如果将用于控制循环的增量定义在for语句中,那么该变量只在for 语句内有效。for语句执行完毕。该变量在内存中被释放。所以不能返回。
作者: 马东华    时间: 2012-4-24 17:27
public static int getSearch(int[] arr,int key)
        {
                for (int min = 0,max = arr.length-1,mid = (min+max)/2;min<=max ;mid = (min+max)/2)
                {
                        if (key<arr[mid])
                                max=mid-1;
                        else if (key>arr[mid])
                                min=mid+1;
                        else
                                return mid;
                }
                        return -1;//不能返回min,max?

你把min,max定义在了for循环中,循环结束后,min,max就消失了,不在内存中了,所以没法返回
作者: 陆强强    时间: 2012-4-24 17:34
马东华 发表于 2012-4-24 17:27
public static int getSearch(int[] arr,int key)
        {
                for (int min = 0,max = arr. ...

public static int getmin(int[]arr)
        {
                int min = arr[0];
                for(int x=1;x<arr.length;x++)
                {
                        if(arr[x]<min)
                                min=arr[x];
                }
                return min;//这里为什么可以
作者: 周海诚    时间: 2012-4-24 17:35
你把min max的值定义在了for循环内,就是局部变量只在for循环的{}内有效 所以不能返回min max的值因为获取不到。正确的代码如下
class Sort
{
        public static void main(String[] args)
        {
                int[] arr = {2,4,5,7,8,19,32,45};
                int x = halfSearch(arr,9);
                System.out.println(x);
        }
        public static int halfSearch(int[] arr,int key)
        {
                int min,max,mid;
                min = 0;
                max = arr.length-1;
                while (min<=max)
                {
                        mid = (min+max)/2;
                        if (key>arr[mid])
                        {
                                min = mid+1;
                        }
                        else if (key<arr[mid])
                        {
                                max = mid-1;
                        }
                        else
                                return mid;
                }
                return min;
        }

作者: 杨威    时间: 2012-4-24 17:44
一个程序返回什么视你的需求而定啊,当你需要返回min,max时,就返回对应的值呗。
对于你这个折半查找程序,如果是想利用它插入一个值时,这时就可返回min(在变量作用范围正确的情况),这是视需求而定的。
作者: 毕博    时间: 2012-4-24 17:46
完全可以,这么打代码就行
public static int getSearch(int[] arr,int key)
     {       
                         int min , max,mid;
             for ( min = 0,max = arr.length-1,mid = (min+max)/2;min<=max ;mid = (min+max)/2)
             {
                     if (key<arr[mid])
                             max=mid-1;
                     else if (key>arr[mid])
                             min=mid+1;
                     else
                             return mid;
             }
              return min;

     }

作者: 杨威    时间: 2012-4-24 17:46
陆强强 发表于 2012-4-24 17:34
public static int getmin(int[]arr)
        {
                int min = arr[0];

你这里是要返回一个最小值啊,而且变量min的作用范围够广
作者: 马东华    时间: 2012-4-24 17:47
陆强强 发表于 2012-4-24 17:34
public static int getmin(int[]arr)
        {
                int min = arr[0];

变量有自己的作用域,对于刚才的程序,你是直接的定义到for循环中的,所以它的作用域是for循环内部,循环结束,也就随着消失,而而对于这个程序你是将变量定义在了getMin方法域中了,所以他的作用域也就是整个方法域中,所以for循环结束了,它依然存在啊,可以返回啊
作者: 魏征    时间: 2012-4-24 19:20
1楼是因为min,max设置在for循环内当循环结束后min,mid自动释放了所以最后不能return min或return max。设置在循环内的变量只在循环内有效。
至于在7楼的问题是因为变量设置在函数内,对整个函数都有效。
如果是像查询一个数在某个排序数组中的位置应当:
public static int getSearch(int[] arr,int key)
        {
                for( int min = 0,max = arr.length-1,mid = (min+max)/2;min<=max ;mid = (min+max)/2)
                {
                        if (key<arr[mid])
                                max=mid-1;
                        else if (key>arr[mid])
                                min=mid+1;
                        else
                                return mid;
                }
                        return -1;//当循环结束后,for循环中没有满足的条件,也就是arr[]中没有key,通常return-1;


如果要是想通过一个排序数组的位置,如果数组不存在则返回应当插入的位置:
public static int getSearch(int[] arr,int key)
        {
            int min = 0,max = arr.length-1,mid = (min+max)/2;
              while(min<=max)
                {
                        if (key<arr[mid])
                                max=mid-1;
                        else if (key>arr[mid])
                                min=mid+1;
                        else
                                return mid;
                }
                        return min;//当循环结束后,for循环中没有满足的条件,key在此数组中应当插入的角标位置;





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2