int bin_search(int *arr, int left, int right, int key)
{
if (left >= right)//如果找不到的话就会出现left>right的情况,所以在这种情况下就说明找不到
return -1;
if(arr[(right - left) / 2 + left]>key)//如果找到数字大于预定值,那么就需要向小的方向走
{
return bin_search(arr, left, left + (right - left) / 2, key);//在这里递归,并且坐标左移
}
else if (arr[(right - left) / 2 + left] < key)
{
return bin_search(arr, right-(right - left) / 2,right, key);//相反
}
if (arr[(right - left) / 2 + left] == key)
return (right - left) / 2 + left;
}//二分查找利用递归还是可以的,但是确实效率不高
int main()
{
int arr[20] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
int K = 0;
while (scanf("%d", &K) != EOF)
printf(" %d \n", bin_search(arr, 0, 19, K));
}
使用递归在进行二分查找的时候发现自己忘了设置找不到怎么办的选项,导致递归深度过深栈溢出。经过修改已经完成,但是也发现了一个有意思的问题。
我们在二分查找的时候是把左边的坐标向右移动,右边的坐标向左移动,这样的话就会出现一个这样的问题:万一没有找到,那么左边的坐标就会大于右边的坐标,反而搜索的范围越来越大,这样就会导致递归无限循环下去,最终导致栈溢出。
所以在面对这种使用两个坐标搜索范围的时候,一定要设置 碰撞 事件,也就是说要让两个坐标可以发生碰撞。