C:递归函数-二进制搜索

C:递归函数-二进制搜索,c,segmentation-fault,C,Segmentation Fault,我试图构建一个递归函数,它通过与中间值进行比较并根据相对大小继续,返回排序数组中的地址。如果该值不在数组中,则应该只打印NULL。现在函数的第一部分工作了,但是每当出现空值时,就会出现分段错误。代码如下所示: #include <stdio.h> int *BinSearchRec(int arr[], int size, int n){ if(n==arr[size/2]){ return &arr[size/2]; } else if(n>

我试图构建一个递归函数,它通过与中间值进行比较并根据相对大小继续,返回排序数组中的地址。如果该值不在数组中,则应该只打印NULL。现在函数的第一部分工作了,但是每当出现空值时,就会出现分段错误。代码如下所示:

#include <stdio.h> 

int *BinSearchRec(int arr[], int size, int n){
  if(n==arr[size/2]){
    return &arr[size/2];
  } 

  else if(n>arr[size/2]) {
    return(BinSearchRec(arr, size+size/2, n));
  }

  else if(n<arr[size/2]) {
    return(BinSearchRec(arr, size-size/2, n));
  }

  else{
    return NULL;                    
  }
 }

 main(){
    int numb[]={2,7,8,9};

 if((int)(BinSearchRec(numb, 4, 22)-numb)>=0)   {
    printf("Position: %d \n", (int)(BinSearchRec(numb, 4, 22)-numb)+1);
    }

     else{
       printf("NULL \n");
     }

  }

你的递归调用是错误的。在第一种情况下,您声称数组的大小比原来大50%,并且您传递的指针错误,您应该传递数组的后半部分

在这两种情况下,数组的大小始终是函数接收的大小的一半。在第二种情况下,需要传递一个指向数组后半部分的指针

差不多

else if(n>arr[size/2]) {
  return(BinSearchRec(arr + sizeof/2, size/2, n));
}

else if(n<arr[size/2]) {
  return(BinSearchRec(arr, size/2, n));
}

您还错误地处理了函数返回的值。它不是一个值,它是一个指向该值的指针,您需要这样对待它。从另一个相关指针中减去一个指针是可以的,这称为指针算术。

除了其他人所说的不正确分割数组和不正确使用返回值之外,您的函数缺少终止条件

在您的代码中,永远不会达到las else,因为前面的三个条件涵盖了所有可能性:n小于、等于或大于arr[size/2]

在访问和比较元素之前,您应该测试子阵列是否实际包含元素。以下是您的代码修订版:

int *BinSearchRec(int arr[], int size, int n)
{
    int m = size/2;

    if (size == 0) return NULL;
    if (n > arr[m]) return BinSearchRec(arr + m + 1, size - m - 1, n);
    if (n < arr[m]) return BinSearchRec(arr, m, n);

    return &arr[m];
}
与其使用单一大小,不如使用两个索引(左索引和右索引)来划分正在探索的子数组,这样更容易进行推理。 根据此方法修改代码将提供:

#include <stdio.h> 
#include <stdlib.h>

int *BinSearchRec(int arr[], int left, int right, int n){
  if (left > right) 
    return NULL;

  int mid = (left + right) / 2;

  if(n == arr[mid])
    return &arr[mid];

  if(n > arr[mid])
    return BinSearchRec(arr, mid + 1, right, n);
  else
    return BinSearchRec(arr, left, mid - 1, n);
 }


int main(int argc, char *argv[]){
  int numb[] = {2,7,8,9};
  int *p = BinSearchRec(numb, 0, 3, 22);

  if (p) {
    printf("Position: %d \n", (int) (p - numb + 1));
  } else {
    printf("NULL \n");
  }
  return 0;
}

您的函数返回和int*,并将其视为int。同时NULL==0=>NULL>=0。这似乎是错误的,您将size添加到大于size的size/2中,并最终伸出数组。代码中有一个输入错误。它应该是returnBinSearchRecarr+size/2,size/2,n;。
#include <stdio.h> 
#include <stdlib.h>

int *BinSearchRec(int arr[], int left, int right, int n){
  if (left > right) 
    return NULL;

  int mid = (left + right) / 2;

  if(n == arr[mid])
    return &arr[mid];

  if(n > arr[mid])
    return BinSearchRec(arr, mid + 1, right, n);
  else
    return BinSearchRec(arr, left, mid - 1, n);
 }


int main(int argc, char *argv[]){
  int numb[] = {2,7,8,9};
  int *p = BinSearchRec(numb, 0, 3, 22);

  if (p) {
    printf("Position: %d \n", (int) (p - numb + 1));
  } else {
    printf("NULL \n");
  }
  return 0;
}