| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1113 人关注过本帖
标题:有点被if语句,弄混了。
只看楼主 加入收藏
wangxiang935
Rank: 3Rank: 3
来 自:南京
等 级:论坛游侠
帖 子:177
专家分:179
注 册:2012-7-11
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:15 
有点被if语句,弄混了。
书上的例子是:这么一个折半查找函数,用于判定已非排序的数组V中是否存在某个特定的x值。数组v元素以升序排列~~~  后面省略,就是对if之后的执行请教下怎么执行的。
函数如下:
 
int binsearch(int x,int [v],int n)
{
    int low,high,mid;
    low=0;
    high=n-1;
    while(low<=high){
    mid=(low+high)/2;
    if(x<v[mid])
         high=mid-1;
     else if(x>v[mid])
     low=mid-1;
   }
  return -1;
}

在这,我就是问下,假如说执行了:   if(x<v[mid])
                                      high=mid-1;
语句后,是回到while再判断,还是直接结束循环呢?
我觉得是再回到while进行判断,但书上说while循环语句内共执行两次测试,不懂?
搜索更多相关主题的帖子: 元素 return 元素 return 
2012-07-18 08:53
long0042
Rank: 2
等 级:论坛游民
帖 子:38
专家分:50
注 册:2008-3-5
收藏
得分:2 
你居然抄书的时候把函数都抄错了。
1、参数就没抄对
2、代码看着不舒服,不知道为啥。没看你这段代码

折半查找的对象首先是排了序的。所以每次取最中间的数,没有找到。
就缩小范围继续找中间的数,和用二叉树查找有点像。确实可以节约不少时间。
2012-07-18 09:42
tiyager
Rank: 2
等 级:论坛游民
帖 子:14
专家分:25
注 册:2012-7-16
收藏
得分:2 
那本书写的?这么垃圾.你要是找到正确的结果,tmd就成了死循环了。
这个数肯定胡扯别看了。
2012-07-18 10:13
wangxiang935
Rank: 3Rank: 3
来 自:南京
等 级:论坛游侠
帖 子:177
专家分:179
注 册:2012-7-11
收藏
得分:0 
回复 2楼 long0042
不好意思,刚才有点事,发代码的时候急了。我就是想问下,比如我执行第一个if(x<v[mid])后,是跳出了循环还是继续回到while呢?
书上说while循环语句内共执行了两次测试,这个循环确实有点搞不懂了。
这个是书上的源代码,我对过了:

int binsearch(int x,int v[],int n)
{
    int low,high,mid;
    low=0;
    high=n-1;
    while(low<=high){
    mid=(low+high)/2;
    if(x<v[mid])
         high=mid-1;
     else if(x>v[mid])
     low=mid+1;
     else
     return mid
   }
  return -1;
}
2012-07-18 11:06
tiyager
Rank: 2
等 级:论坛游民
帖 子:14
专家分:25
注 册:2012-7-16
收藏
得分:2 
找到正确结果的时候就跳出循环了,其他情况就一直在while里面玩呢.
2012-07-18 11:10
wangxiang935
Rank: 3Rank: 3
来 自:南京
等 级:论坛游侠
帖 子:177
专家分:179
注 册:2012-7-11
收藏
得分:0 
回复 5楼 tiyager
我也觉得是啊。但“while循环语句内共执行两次测试” 这句话怎么理解呢?
2012-07-18 11:29
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
if()语句块中没有使用break就仍在while()循环中,没有跳出。所谓执行了两次判断,是while()循环体中存在两处地方是做判断的,第一个是while()处的循环检测,第二个就是里面的if()。

授人以渔,不授人以鱼。
2012-07-18 11:34
wangxiang935
Rank: 3Rank: 3
来 自:南京
等 级:论坛游侠
帖 子:177
专家分:179
注 册:2012-7-11
收藏
得分:0 
回复 7楼 TonyDeng
恩,懂了,谢谢了。
2012-07-18 11:45
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 4楼 wangxiang935
你太浮躁了,不能静下心,书上的源代码你照抄两次还没搞利索,就这代码你肯定编译不过,到时候又要发帖说这是书上的代码为什么编译不过

总有那身价贱的人给作业贴回复完整的代码
2012-07-18 11:46
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
书上这么写可能是 测试 x < v[mid] 和 x > v[mid] 都不成立后 得到 x = v[mid] 这样就得到想要的结果 退出循环。
呵呵 这书也是搞的很啊 这样来表述一个循环是很不严谨的 你关键是理解循环的实质 。该质疑的时候就质疑别‘尽信书’。

梅尚程荀
马谭杨奚







                                                       
2012-07-18 11:47
快速回复:有点被if语句,弄混了。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017035 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved