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) 您的代码即可运行。