为什么不使用Recursion进行二进制搜索以获得排序数组

时间:2017-09-10 19:38:34

标签: c cs50

我试图实现一个二进制搜索,其中n是我的数组的大小,并且它不能用于递归,只有当我不使用递归时它是否有效,我不会似乎明白为什么

int mid = 0;
int low = 0;

bool search(int value, int values[], int n)
{
   do
   {
   mid = (low + n)/2; 
   if(values[mid] == value) 
   {
        return true;
   }
   else if (values[mid]>value) 
   {
       n= mid -1;
       return search(value, values,  n);


   }
   else if (values[mid]<value)
   {
        low = mid + 1;
       return search(value, values,  low);

   }
 }
 while (n > low);

return false;
}

2 个答案:

答案 0 :(得分:2)

问题是你调用递归调用,用指向下半部分的指针搜索数组的上半部分。因此,如果值在上半部分,则无法找到它。你需要这样的东西:

bool search(int value, int values[], int n) {
    int mid = n/2;
    if (n <= 0) {
        return false;
    } else if (values[mid] == value) {
        return true;
    } else if (values[mid] > value) {
        return search(value, values, mid);
    } else if (values[mid] < value) {
        return search(value, values + mid + 1, n - mid - 1);
    }
 }

答案 1 :(得分:0)

您的计划是两种不同解决方案的混合体。你要么必须用循环或递归函数来解决这个问题。

你尝试使用的循环应该做这样的事情。这里不需要递归。

while (low <= high) {
   mid = (low+high) / 2;
   if (value < values[mid])
      high = mid - 1;
   else if (value > values[mid])
      low = mid + 1;
   else
      return true;
}
return false;

如果需要使用递归,则不需要循环。你的答案可能如下:

bool search(int value, int values[], int low, int high ) {
   if (low <= high) {
      int mid = (low + high)/2;
      if (values[mid] == value)
         return true;
      else if (value > values[mid])
         return search(value, values, mid+1, high);
      else
         return search(value, values, 1, mid-1);
   }
   return false;
}

我在这里假设您可以定义自己的函数头。