使用递归在 C 中进行二进制搜索
Binary Search in C using recursion
当我搜索 array.Help 中可用的元素时,程序在查找 array.The 代码中不可用的数字时崩溃非常感谢。
#include<stdio.h>
int binarySearch(int a[],int s,int key)
{
int middle;
if(s!=1)
middle=s/2;
if(a[middle]==key)
return 1;
else if(key<a[middle])
binarySearch(a,middle,key);
else if(key>a[middle])
binarySearch(&a[middle],middle,key);
else
return 0;
}
void main()
{
int i;
int a[]={1,2,3,4,6,9,10,11};
for (i =0;i<8;i++)
printf("%i ",a[i]);
if(binarySearch(a,8,5))
printf("\nFound");
else
printf("\nNot Found");
}
代码 if(key<a[middle])binarySearch(a,middle,key);
没有 return 任何东西。
尝试if(key<a[middle]) return binarySearch(a,middle,key);
这可能仍然无法像您预期的那样工作,但至少您将克服导致失控递归的主要、立即可见的原因。
因为不存在 s == 1 的情况。"Middle" 未初始化并且 [middle] 是潜在的崩溃,否则它将无限增长。
改变
if(s!=1)
middle=s/2;
if(a[middle]==key)
return 1;
else if(key<a[middle])binarySearch(a,middle,key);
else if(key>a[middle])binarySearch(&a[middle],middle,key);
到
if (s != 1){
middle = s / 2;
if (a[middle] == key)
return 1;
else if (key<a[middle])binarySearch(a, middle, key);
else if (key>a[middle])binarySearch(&a[middle], middle, key);
}
只有在s!=1
时才初始化变量middle
。
我有 运行 这段代码并获得了输入值 Not Found
5
。
如果您运行在发布模式下编译您的代码,请尝试在调试模式下构建它,然后 运行 一步一步,您将看到直接使用 middle 而不为其指定特定值时会发生什么价值。这是有害的。
希望对您有所帮助。
一些注意事项:
递归函数的每个分支都应该return一些东西。您需要将递归调用修改为 return 调用
改变
binarySearch(a, middle, key)
到
return binarySearch(a, middle, key)
此外,请确保正确计算中间值。在 s == 1 的情况下,您没有正确初始化它。您很可能希望它从 0 开始。
当我搜索 array.Help 中可用的元素时,程序在查找 array.The 代码中不可用的数字时崩溃非常感谢。
#include<stdio.h>
int binarySearch(int a[],int s,int key)
{
int middle;
if(s!=1)
middle=s/2;
if(a[middle]==key)
return 1;
else if(key<a[middle])
binarySearch(a,middle,key);
else if(key>a[middle])
binarySearch(&a[middle],middle,key);
else
return 0;
}
void main()
{
int i;
int a[]={1,2,3,4,6,9,10,11};
for (i =0;i<8;i++)
printf("%i ",a[i]);
if(binarySearch(a,8,5))
printf("\nFound");
else
printf("\nNot Found");
}
代码 if(key<a[middle])binarySearch(a,middle,key);
没有 return 任何东西。
尝试if(key<a[middle]) return binarySearch(a,middle,key);
这可能仍然无法像您预期的那样工作,但至少您将克服导致失控递归的主要、立即可见的原因。
因为不存在 s == 1 的情况。"Middle" 未初始化并且 [middle] 是潜在的崩溃,否则它将无限增长。
改变
if(s!=1)
middle=s/2;
if(a[middle]==key)
return 1;
else if(key<a[middle])binarySearch(a,middle,key);
else if(key>a[middle])binarySearch(&a[middle],middle,key);
到
if (s != 1){
middle = s / 2;
if (a[middle] == key)
return 1;
else if (key<a[middle])binarySearch(a, middle, key);
else if (key>a[middle])binarySearch(&a[middle], middle, key);
}
只有在s!=1
时才初始化变量middle
。
我有 运行 这段代码并获得了输入值 Not Found
5
。
如果您运行在发布模式下编译您的代码,请尝试在调试模式下构建它,然后 运行 一步一步,您将看到直接使用 middle 而不为其指定特定值时会发生什么价值。这是有害的。
希望对您有所帮助。
一些注意事项:
递归函数的每个分支都应该return一些东西。您需要将递归调用修改为 return 调用
改变
binarySearch(a, middle, key)
到
return binarySearch(a, middle, key)
此外,请确保正确计算中间值。在 s == 1 的情况下,您没有正确初始化它。您很可能希望它从 0 开始。