C调试中的递归线性搜索
Recursive Linear Search in C debug
问题:1
在此代码中,如果我搜索一个不在数组中的数字,它应该显示 Value not found
但我不知道它不会显示该消息,而是每次显示 Found value in element -5
我不知道为什么会这样发生。
#include<stdio.h>
#define SIZE 100
size_t linearSearch(const int array[], int key, size_t size);
int main(void)
{
int a[SIZE];
size_t x;
int searchKey;
size_t element;
for(x=0; x<SIZE; ++x){
a[x] = 2*x;
}
for(x=0; x<SIZE; ++x){
if(x%10 == 0){
puts("");
}
printf("%5d", a[x]);
}
puts("\n\nEnter integer search key:");
scanf("%d", &searchKey);
// attempt to locate searchKey in array a
element = linearSearch(a, searchKey, SIZE);
// display results
if(element != -1){
printf("Found value in element %d", element);
}
else{
puts("Value not found");
}
}
size_t linearSearch(const int array[], int key, size_t size)
{
if(size<0){
return -1;
}
if(key == array[size-1]){
return size-1;
}
return linearSearch(array, key, size-1);
}
问题:2
怎么看不懂
size_t linearSearch(const int array[], int key, size_t size)
函数专门针对这些行
if(key == array[size-1]){
return size-1;
return linearSearch(array, key, size-1);
1) 主要问题是if(size<0){
。条件表达式永远为假。因为 size_t 是无符号整数。因此,它 returns 随机位置找到的值(这是未定义的行为)偶然变成一个大数字(例如 -5 是 4294967291 无符号)没有结束(未找到)。
if(size<0){
应该是 if(size==0){
2) 如果键匹配最后一个元素,returns它的位置。如果不是,请用较短的尺码重复。如果大小为零,则找不到密钥。
正如大家所说,你有一个小错误就是你应该写if(size==0)
而不是if(size<0).
让我解释一下 linearSearch()
函数中递归发生的事情
size_t linearSearch(const int array[], int key, size_t size)
{
if(size == 0){
return -1;
}
else
if(key == array[size-1]){
return size-1;
}
else{
return linearSearch(array, key, size-1);
}
}
假设您输入了 198
作为搜索关键字。
当您通过语句
调用 linearSearch()
函数时
element = linearSearch(a, searchKey, SIZE);
您正在将对 array[], searchKey 198, and Size 100
的引用作为参数传递。
在 linearSearch 函数中,首先 if 语句 if(size==0)
检查大小是否等于零,如果不等于,则运行 else if 语句。
in else if 语句 If(198 == array[100-1])
条件被检查。
我们看到 198
出现在 array[99]
中,所以 else 如果条件为真,则 linearSearch 函数 return 结果为 99。
现在让我们看看如果您输入不在数组列表中的 55
会发生什么。
if(size==0) 不正确,所以程序将跳过它并转到下一条语句。
if(55 == array[100-1]
将被检查为不正确,然后 linearSearch(array, 55, 100-1)
将被调用。将再次检查 if(55==array[99-1])
。
在某些时候,大小将变为 0。第一个 if(size==0)
语句将执行。
只需将 if 语句从 if(size<0)
更改为 if(size==0)
您的代码即可运行。
问题:1
在此代码中,如果我搜索一个不在数组中的数字,它应该显示 Value not found
但我不知道它不会显示该消息,而是每次显示 Found value in element -5
我不知道为什么会这样发生。
#include<stdio.h>
#define SIZE 100
size_t linearSearch(const int array[], int key, size_t size);
int main(void)
{
int a[SIZE];
size_t x;
int searchKey;
size_t element;
for(x=0; x<SIZE; ++x){
a[x] = 2*x;
}
for(x=0; x<SIZE; ++x){
if(x%10 == 0){
puts("");
}
printf("%5d", a[x]);
}
puts("\n\nEnter integer search key:");
scanf("%d", &searchKey);
// attempt to locate searchKey in array a
element = linearSearch(a, searchKey, SIZE);
// display results
if(element != -1){
printf("Found value in element %d", element);
}
else{
puts("Value not found");
}
}
size_t linearSearch(const int array[], int key, size_t size)
{
if(size<0){
return -1;
}
if(key == array[size-1]){
return size-1;
}
return linearSearch(array, key, size-1);
}
问题:2
怎么看不懂
size_t linearSearch(const int array[], int key, size_t size)
函数专门针对这些行
if(key == array[size-1]){
return size-1;
return linearSearch(array, key, size-1);
1) 主要问题是if(size<0){
。条件表达式永远为假。因为 size_t 是无符号整数。因此,它 returns 随机位置找到的值(这是未定义的行为)偶然变成一个大数字(例如 -5 是 4294967291 无符号)没有结束(未找到)。
if(size<0){
应该是 if(size==0){
2) 如果键匹配最后一个元素,returns它的位置。如果不是,请用较短的尺码重复。如果大小为零,则找不到密钥。
正如大家所说,你有一个小错误就是你应该写if(size==0)
而不是if(size<0).
让我解释一下 linearSearch()
函数中递归发生的事情
size_t linearSearch(const int array[], int key, size_t size)
{
if(size == 0){
return -1;
}
else
if(key == array[size-1]){
return size-1;
}
else{
return linearSearch(array, key, size-1);
}
}
假设您输入了 198
作为搜索关键字。
当您通过语句
linearSearch()
函数时
element = linearSearch(a, searchKey, SIZE);
您正在将对 array[], searchKey 198, and Size 100
的引用作为参数传递。
在 linearSearch 函数中,首先 if 语句 if(size==0)
检查大小是否等于零,如果不等于,则运行 else if 语句。
in else if 语句 If(198 == array[100-1])
条件被检查。
我们看到 198
出现在 array[99]
中,所以 else 如果条件为真,则 linearSearch 函数 return 结果为 99。
现在让我们看看如果您输入不在数组列表中的 55
会发生什么。
if(size==0) 不正确,所以程序将跳过它并转到下一条语句。
if(55 == array[100-1]
将被检查为不正确,然后 linearSearch(array, 55, 100-1)
将被调用。将再次检查 if(55==array[99-1])
。
在某些时候,大小将变为 0。第一个 if(size==0)
语句将执行。
只需将 if 语句从 if(size<0)
更改为 if(size==0)
您的代码即可运行。