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