| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 643 人关注过本帖
标题:二分法查找return 问题
只看楼主 加入收藏
Leeprison
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-1-15
结帖率:0
收藏
已结贴  问题点数:20 回复次数:10 
二分法查找return 问题
程序代码:
#include<stdio.h>
#define ARRAY_LENGTH 10
int binarySearch(int num[],int first,int last,int target){
    int mid=(first+last)/2;
    printf("%d\n",mid);
    if(num[mid]<target){
        binarySearch(num,mid,last,target);
    }
    if(num[mid]>target){
        binarySearch(num,first,mid,target);
    }
    if(num[mid]==target){
        printf("getin=%d\n",mid);
        return mid;
    }

}


main(){
    int num[ARRAY_LENGTH]={1,2,3,4,5,6,7,8,9,10};
    printf("result=%d\n",binarySearch(num,0,ARRAY_LENGTH-1,9));

}

 无法将结果带回来,有谁知道原因的

[ 本帖最后由 Leeprison 于 2013-1-15 11:07 编辑 ]
搜索更多相关主题的帖子: return target 二分法 
2013-01-15 10:44
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:3 
if(num[mid]<target){
       return binarySearch(num,mid,last,target);
    }
    if(num[mid]>target){
        return  binarySearch(num,first,mid,target);
    }
2013-01-15 10:53
iloveyn2000
Rank: 1
等 级:新手上路
帖 子:8
专家分:3
注 册:2012-7-29
收藏
得分:3 
main()的上面多了一个“}”;还有就是这个程序好像会一直递归调用,不会停止,因为这句“int mid=(first+last)/2;”,mid的值依次取4,6,,7,8取到8的时候mid的值因为(8+9)/2取整总是得8,不会出现num[mid]==target的情况,所以应该会一直递归吧,个人理解,望指正。
2013-01-15 11:12
Leeprison
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-1-15
收藏
得分:0 
回复 2楼 hahayezhe
我明白你的思路,层层的将返回值压回来~
如果断开的话,可能寄存器中就是别的数值~
但是我还是有一个问题,如果程序就是这么写为什么结果是5

我觉得应该是在运行num[4]这条语句的时候,将5的值压入了寄存器中,结果函数在取返回值的时候就用了这个值~可能你们运行的结果会跟我的不同

[ 本帖最后由 Leeprison 于 2013-1-15 11:26 编辑 ]
2013-01-15 11:16
Leeprison
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-1-15
收藏
得分:0 
回复 3楼 iloveyn2000
第一个问题修正了  第二个问题:num[8]==9   true   
不过倒是有一个问题,就是当target 不再num[10] 中的时候会出错。
所以得加个判断

[ 本帖最后由 Leeprison 于 2013-1-15 13:52 编辑 ]
2013-01-15 11:17
不玩虚的
Rank: 9Rank: 9Rank: 9
来 自:四川
等 级:贵宾
威 望:10
帖 子:331
专家分:1301
注 册:2012-12-9
收藏
得分:3 
#include <iostream>
using namespace std;
template <class Type>
int BinarySearch(Type *a, Type x,int n)
{int left=0,right=n-1;
    while(left<=right)
    {int middle=(left+right)/2;
        if(x==a[middle])    return (middle);
        if(x>a[middle])        left=middle+1;
        else right=middle-1;
    }
    return (-1);
}
int main()
{    int *a,n,i;
    cout<<"input the number of the array:"<<endl;
    cin>>n;
    a=new int [n];
    cout<<"input the array:"<<endl;
    for( i=0;i<n;i++)
        cin>>a[i];
   
    for( i=0;i<n;i++)
        cout<<" "<<a[i];
    cout<<endl;
    int x;
    cout<<"input the number you want to search :"<<endl;
    cin>>x;

cout<<BinarySearch(a,x, n)<<endl;
    return 0;
}//共同研究下二分搜索啊,我这个也是二分搜索吧

同学习......同进步....你帮我......我帮你.....上善若水.....
2013-01-15 14:19
Leeprison
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-1-15
收藏
得分:0 
回复 6楼 不玩虚的
也是。非递归写法而已。
2013-01-15 15:25
黄昏黄昏
Rank: 2
等 级:论坛游民
帖 子:49
专家分:41
注 册:2013-1-10
收藏
得分:3 
return放在了最后一个if里,除非第一次查找就找到了,否则是没有返回值的

得不到的永远在骚动,被偏爱都有恃无恐
2013-01-15 17:39
黄昏黄昏
Rank: 2
等 级:论坛游民
帖 子:49
专家分:41
注 册:2013-1-10
收藏
得分:0 
抱歉,刚才回答错了~
代码没什么大问题,只是自定义函数返回的是mid,mid只是元素序号而已,所以可以改成return num[mid]; 或者main里printf参数改成num[binarySearch(XXX)]  ,另外,由于是递归函数,所以会多执行一次binarySearch里的第一条语句,所以得到的mid是我们需要的值/2,所以需要改成 return[mid*2],另一个改法同上。

 我又错了%>_<%------只能在main里改成binarySearch 里return mid,main里num[binarySearch(XXX)*2]~因为如果像上面那样的话同样会由于递归再/2一次。。

[ 本帖最后由 黄昏黄昏 于 2013-1-15 18:59 编辑 ]

得不到的永远在骚动,被偏爱都有恃无恐
2013-01-15 17:42
h1023417614
Rank: 4
等 级:禁止访问
帖 子:211
专家分:237
注 册:2012-11-30
收藏
得分:3 
    printf("result=%d\n",binarySearch(num,0,ARRAY_LENGTH-1,9));

    printf("result=%d\n",binarySearch(num,num[0],num[ARRAY_LENGTH-1],9));
2013-01-16 11:07
快速回复:二分法查找return 问题
数据加载中...
 
   



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

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