C: 递归函数——二分查找

标签 c segmentation-fault

我正在尝试构建一个递归函数,该函数通过与中间值进行比较并根据相对大小进行处理来返回排序数组中的地址。如果该值不在数组中,则应该简单地打印 NULL。现在该函数的第一部分起作用了,但是每当应该发生 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%,并且您传递的指针错误(您应该传递数组的第二个“一半”)。 p>

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

有点像

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

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

关于C: 递归函数——二分查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28024176/

相关文章:

c - 引用调用的内部工作原理

c - 队列返回的指针不能在没有段错误的情况下被取消引用

c - 打印期间出现段错误,包括大型数组计算

c - 使用 C api 调用 Ruby 函数时出现段错误

linux - x86 内存访问段错误

c - 动态分配数组中的值既不能访问也不能更改

c - 为什么这些词不附加在 C 中?

c - 前序树遍历有效但后序无效

c - "int *path"和 "int path[]"之间有什么区别吗?

c++ - 我的 QuadTree 实现遇到问题