#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;
}
low > high 应该直接返回了,你还在继续递归
递归出口设计得有问题
函数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);
}
这种问题我建议你设置断点单步调试,并且设置个打印,很容易就能找出,对自己也是个很好的提升