C 调试中的递归线性搜索
Posted
技术标签:
【中文标题】C 调试中的递归线性搜索【英文标题】:Recursive Linear Search in C debug 【发布时间】:2016-10-03 19:49:49 【问题描述】:问题: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 线性搜索(const int array[], int key, size_t size)
函数专门用于这些行
if(key == array[size-1])
return size-1;
return linearSearch(array, key, size-1);
【问题讨论】:
if(size<0)
对于无符号值来说是愚蠢的
看起来是学习调试器的好例子。使用调试器。它可以在您逐步执行每条指令时向您显示变量的值。
只需将size<0
更改为size==0
。
@stark 0 是数组的大小而不是位置。 size-1
是职位。
如果你想返回-1
,你也应该把size_t
改成int
。
【参考方案1】:
正如大家所说,你有一个小错误,你应该写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)
检查大小是否等于 0,如果不是,则 else if 语句运行。
在 else if 语句 If(198 == array[100-1])
条件被检查。
我们看到198
存在于array[99]
中,所以else if 条件为真,因此linearSearch 函数返回99 作为结果。
现在让我们看看如果您输入不在数组列表中的55
会发生什么。
if(size==0) 不正确,因此程序将跳过它并转到下一条语句。
if(55 == array[100-1]
将被检查为它不是真的然后linearSearch(array, 55, 100-1)
将被调用。再次检查if(55==array[99-1])
。
在某个点大小将变为 0。第一个 if(size==0)
语句将执行。
【讨论】:
【参考方案2】:1) 主要问题是if(size<0)
。条件表达式将始终为假。因为 size_t 是无符号整数。因此,它返回一个随机位置,其中找到的值(这是未定义的行为)偶然变成一个大数字(例如 -5 是 4294967291 无符号)而没有结束(未找到)。
if(size<0)
应该是if(size==0)
2) 如果 key 匹配最后一个元素,则返回其位置。如果没有,请使用较短的一种尺寸重复。如果大小为零,则找不到键。
【讨论】:
【参考方案3】:只需将 if 语句从 if(size<0)
更改为 if(size==0)
您的代码即可。
【讨论】:
以上是关于C 调试中的递归线性搜索的主要内容,如果未能解决你的问题,请参考以下文章