A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高鑫 中级黑马   /  2012-4-27 02:12  /  2281 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  请问下面这个循环语句中,第一个if+语句,else if+语句,if+语句,这3部分哪几部分属于while循环结构。

        
        while(min<=max )
        if(key>arr[mid])                           //第一个if
            min=mid+1;                  
            else if(key<arr[mid])                   //第二个else if
                max=mid-1;
            if  (key==arr[mid])                    //第3个if
                return mid;
            mid=(min+max)/2;
   

9 个回复

倒序浏览
这是二分法找key的方法,三个if肯定都在循环里,也都属于循环,具体看代码:
  1. while(min<=max )
  2.         if(key>arr[mid])                           //第一个if 判断key离min较近,可以让max向min移动,需要循环
  3.             min=mid+1;                  
  4.             else if(key<arr[mid])                   //第二个else if 判断key离max较近,可以让min向max移动,需要循环
  5.                 max=mid-1;
  6.             if  (key==arr[mid])                    //第3个if 判断key和max与min的中间值是否相等,前两个条件循环的同时,这个也有可能成立
  7.                 return mid;
  8.             mid=(min+max)/2;
复制代码
回复 使用道具 举报
第三个if断开了,不属于while体内
回复 使用道具 举报
while(min<=max )
        if(key>arr[mid])                         //while循环内
            min=mid+1;                  
            else if(key<arr[mid])                   //while循环内
                max=mid-1;
            if  (key==arr[mid])                    //while循环外
                return mid;
            mid=(min+max)/2;
回复 使用道具 举报
本帖最后由 陆强强 于 2012-4-27 08:20 编辑

三个循环都不能放在循环外,不然你这代码执行不了,
while(min<=max )
  {
    if(key>arr[mid])                        
            min=mid+1;
    else if(key<arr[mid])                 
            max=mid-1;
    if  (key==arr[mid])                  
            return mid;
    mid=(min+max)/2;
  }
   return min;
回复 使用道具 举报
while(min<=max )
        if(key>arr[mid])                           //第一个if//只有这一个if语句是属于while循环的循环体
            min=mid+1;                  
            else if(key<arr[mid])                   //第二个else if
                max=mid-1;
            if  (key==arr[mid])                    //第3个if
                return mid;
            mid=(min+max)/2;
楼主想做的是折半查找吧,while循环的时候,在没加大括号的情况下,会把与它最近的一个语句作为循环体的,后面的都不在循环之内……为了避免这种情况出现,在些循环结构的时候还是按照格式,不管循环体是一句还是多句,都加上括号,这样安全,if,for都是这样的
回复 使用道具 举报
         while(min<=max )
         if(key>arr[mid])                           //第一个if  
             min=mid+1;                  
            else if(key<arr[mid])                   //第二个else if
                 max=mid-1;
             if  (key==arr[mid])                    //第3个if
                 return mid;
             mid=(min+max)/2;
    当然是第一个if在while循环结构里了。因为程序在执行没有加大括号限制范围时,就会自动按照临近原则,
执行离它最近的那一行代码。
        不过,这样写虽然简化了,但是,很不利于阅读。最好按照规范来写。这样方便他人和自己日后观看和阅读。
回复 使用道具 举报
丁佼 黑马帝 2012-4-27 15:54:02
8#
   while(min<=max )
        if(key>arr[mid])                           //第一个if
            min=mid+1;  

只有第一个if属于while管辖,在没有{}标示范围的情况下,第一个分号(;)标志了循环或者if等流程控制语句块的结束。
回复 使用道具 举报
while(min<=max ){
        if(key>arr[mid])                           //第一个if
            min=mid+1;                  
            else if(key<arr[mid])                   //第二个else if
                max=mid-1;
          }
            if  (key==arr[mid])                    //第3个if
                return mid;
            mid=(min+max)/2;

被红色括号括起来的是一个逻辑,它在while循环中
蓝色部分在循环外

点评

兄弟你说的对,刘老师点评错了  发表于 2012-4-28 23:39
回复 使用道具 举报
都在循环里
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马