Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么不使用递归对排序数组进行二进制搜索_C_Cs50 - Fatal编程技术网

C 为什么不使用递归对排序数组进行二进制搜索

C 为什么不使用递归对排序数组进行二进制搜索,c,cs50,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]>

我试图实现一个二进制搜索,其中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;
}
intmid=0;
int低=0;
布尔搜索(int值,int值[],int n)
{
做
{
中等=(低+n)/2;
如果(值[mid]==值)
{
返回true;
}
else if(值[mid]>值)
{
n=中-1;
返回搜索(值,值,n);
}
否则(值[中]低);
返回false;
}

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

你尝试使用的循环应该是这样的,这里不需要递归

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;
while(低值[中])
低=中+1;
其他的
返回true;
}
返回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;
}
bool搜索(int值、int值[]、int低、int高){
if(低值[中])
返回搜索(值、值、中+1、高);
其他的
返回搜索(value,values,1,mid-1);
}
返回false;
}

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

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

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);
    }
 }
bool搜索(int值,int值[],int n){
int-mid=n/2;
if(n值){
返回搜索(值、值、mid);
}else if(值[中间]<值){
返回搜索(value,value+mid+1,n-mid-1);
}
}

如果使用递归,是否需要Do while循环?搜索的函数头必须是这样的吗?或者我们可以让它只是布尔搜索(int-value,int-values[])?或者布尔搜索(int-value,int-values[],int-low,int-high)?@MarcLambrichs:函数参数中的数组实际上是指针,所以这是传递指针而不是int