黑马程序员技术交流社区

标题: while 循环中的条件改变问题 [打印本页]

作者: 邹海洋    时间: 2012-6-6 13:12
标题: while 循环中的条件改变问题
本帖最后由 邹海洋 于 2012-10-30 14:57 编辑

public class ZheBan1
{
        //定义求值的方法
        public static int halfSearch(int [] arr,int key)
        {
                int min = 0,max = arr.length-1,mid=0;
                while (min<=max)
                {
                        mid = (min+max)>>1;
                        if (key < arr[mid])
                        {
                                max = mid - 1;
                        }else if (key>arr[mid])
                        {
                                min = mid + 1;
                        }else
                        {
                                return mid;
                        }
                        //mid = (min + max)>>1;      //此处如果注释掉,那么这个循环不就没法继续吗但是,结果却是对的,求解?
                }
                return -1;
        }
        //定义主函数
        public static void main(String args[])
        {
                int score[]={2,3,5,7,9,23,25,35,56};
                int num = halfSearch(score,56);
                System.out.println(num);
        }
}
作者: 杨海波    时间: 2012-6-6 13:20
本帖最后由 杨海波 于 2012-6-6 13:24 编辑

你看一下你的代码:
  1. public static int halfSearch(int [] arr,int key)
  2.         {
  3.                 int min = 0,max = arr.length-1,mid=0;
  4.                 while (min<=max)
  5.                 {
  6.                         [color=Red]mid = (min+max)>>1;[/color]                        if (key < arr[mid])
  7.                         {
  8.                                 max = mid - 1;
  9.                         }else if (key>arr[mid])
  10.                         {
  11.                                 min = mid + 1;
  12.                         }else
  13.                         {
  14.                                 return mid;
  15.                         }
  16.                         //mid = (min + max)>>1;      //此处如果注释掉,那么这个循环不就没法继续吗但是,结果却是对的,求解?
  17.                 }
  18.                 return -1;
复制代码
上面已经有一个mid = (min + max)>>1,这个是在局部中的语句,比如执行了max=mid-1,那上面的局部变量就重新赋值了,继续这样循环,知道找到结果为止,你那一句是多余的。
看我自己写的一中折半查找:
  1. public static int halfSearch(int[]arr,int key)
  2. {
  3. int min,max,mid;
  4. min = 0;
  5. max = arr.length-1;
  6. mid=(min+max)/2;
  7. while(arr[mid]!=key)
  8. {
  9. if(key>arr[mid])
  10. min = mid+1;
  11. else if(key<arr[mid])
  12. max = mid-1;
  13. if(min>max)
  14. return -1;
  15. mid = (max+min)/2;

  16. }

  17. return mid;
  18. }
复制代码
折半查找有多种写法,关键就是要找我它的原理。

作者: 马东华    时间: 2012-6-6 13:21
  1. while (min<=max)
  2.                 {
  3.                         mid = (min+max)>>1;//这一步你已经定义为mid的值了啊,
  4.                         if (key < arr[mid])
  5.                         {
  6.                                 max = mid - 1;
  7.                         }else if (key>arr[mid])
  8.                         {
  9.                                 min = mid + 1;
  10.                         }else
  11.                         {
  12.                                 return mid;
  13.                         }
  14.                         //mid = (min + max)>>1;     //这一步没有作用啊 ,加不加注释对结果没有影响的啊               }
  15.                 return -1;
复制代码

作者: 吴小铁你好    时间: 2012-6-6 13:26
本帖最后由 吴小铁你好 于 2012-6-6 13:28 编辑
  1. public class ZheBan1
  2. {
  3. //定义求值的方法
  4. public static int halfSearch(int [] arr,int key)
  5. {
  6. int min = 0,max = arr.length-1,mid=0;
  7. while (min<=max)
  8. {
  9. mid = (min+max)>>1;//此处以有了改变while条件量。
  10. if (key < arr[mid])
  11. {
  12. max = mid - 1;
  13. }else if (key>arr[mid])
  14. {
  15. min = mid + 1;
  16. }else
  17. {
  18. return mid;
  19. }
  20. //mid = (min + max)>>1; //此处如果注释掉,那么这个循环不就没法继续吗但是,结果却是对的,求解?
  21. }
  22. return -1;
  23. }
  24. //定义主函数
  25. public static void main(String args[])
  26. {
  27. int score[]={2,3,5,7,9,23,25,35,56};
  28. int num = halfSearch(score,56);
  29. System.out.println(num);
  30. }
  31. }
复制代码
你在while中第九行已经有一个
  1. mid = (min+max)>>1;
复制代码
,下面的这个可以注释不影响结果。但如果你把上面的这个也注释就会一直循环啊。
作者: 邹海洋    时间: 2012-6-6 13:28
非常感谢,也就是说改变条件的表达式不一定要在最后,之前对mid的赋值同样起到这样的作用。




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