用递归进行二分法查找,求大神看一下哪边错了,调试了就停止运行

#include
int binary_search_recursive(int arr[], int left, int right, int query);

int main ()
{
int arr[10];
int left, right, query;
int i , res_r;

printf ("请输入数据:");
for (i = 0; i <= 9; i++)
scanf ("%d" , &arr[i]);

printf ("输入区间:");
scanf ("%d%d" , &left , &right);

printf ("输入要查找的数据:");
scanf ("%d" , &query);

res_r = binary_search_recursive(arr , left , right , query);

printf ("%d\n" , res_r);
return 0;

}
int binary_search_recursive(int arr[], int left, int right, int query)
{
int low = left , high = right , mid;
int flag = 0;

mid = (low + high) / 2;
if (low > high)
    flag = -1;
if (query == arr[mid])
    flag = 1;
if (arr[mid] > query)
    binary_search_recursive(arr , low , mid - 1 , query);
else
    binary_search_recursive(arr , mid + 1 , high , query);


if (flag == 1)
return mid;
if (flag == -1)
return -1;

}

3个回答

low > high 应该直接返回了,你还在继续递归

递归出口设计得有问题

Debug_dodge
Debug_dodge 是的,底下那个flag=1的也改成返回。你这个无限递归了
大约 2 年之前 回复
qq_40833445
qq_40833445 那是直接把flag=-1改成return -1吗?
大约 2 年之前 回复

函数return根据flag倒是没什么问题,可是按你这个写法即便是low>high也会继续执行后面的查找算法,并且在arr[mid]不等于query时直接就没有返回值了,槽点有点多.稍微改了下函数,运行是没什么问题了,可是二分查找要求有序,你这里随便给个数组不用先检测是否有序吗.

int binary_search_recursive(int arr[], int left, int right, int query)
{

int low = left , high = right , mid;
mid = (low + high) / 2;
if (low > high)
    return -1;
if (query == arr[mid])
    return mid;
if (arr[mid] > query)
    return binary_search_recursive(arr , low , mid - 1 , query);
else
    return binary_search_recursive(arr , mid + 1 , high , query);

}

这种问题我建议你设置断点单步调试,并且设置个打印,很容易就能找出,对自己也是个很好的提升

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问