【问题标题】:Why not use Recursion for Binary Search for a sorted array为什么不对排序数组使用递归进行二分搜索
【发布时间】:2017-09-10 19:38:34
【问题描述】:

我正在尝试实现二进制搜索,其中 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;
}

【问题讨论】:

  • 如果使用递归,是否需要 do while 循环?
  • 搜索的函数头必须是这样的吗?还是我们可以让它只是 bool search(int value, int values[])?
  • 或者 bool search(int value, int values[], int low, int high)?

标签: c cs50


【解决方案1】:

问题是您调用递归调用来搜索数组的上半部分,并使用指向下半部分的指针。因此,如果该值在上半部分,它将找不到它。你需要这样的东西:

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);
    }
 }

【讨论】:

  • @MarcLambrichs:函数参数中的数组实际上是指针,所以这是传递指针而不是 int
【解决方案2】:

您的程序混合了两种不同的解决方案。您必须使用循环或递归函数来解决这个问题。

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

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;
}

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

【讨论】: