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&lt;0) 对于无符号值来说是愚蠢的 看起来是学习调试器的好例子。使用调试器。它可以在您逐步执行每条指令时向您显示变量的值。 只需将size&lt;0 更改为size==0 @stark 0 是数组的大小而不是位置。 size-1 是职位。 如果你想返回-1,你也应该把size_t改成int 【参考方案1】:

正如大家所说,你有一个小错误,你应该写if(size==0)而不是if(size&lt;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&lt;0)。条件表达式将始终为假。因为 size_t 是无符号整数。因此,它返回一个随机位置,其中找到的值(这是未定义的行为)偶然变成一个大数字(例如 -5 是 4294967291 无符号)而没有结束(未找到)。

if(size&lt;0) 应该是if(size==0)

2) 如果 key 匹配最后一个元素,则返回其位置。如果没有,请使用较短的一种尺寸重复。如果大小为零,则找不到键。

【讨论】:

【参考方案3】:

只需将 if 语句从 if(size&lt;0) 更改为 if(size==0)您的代码即可。

【讨论】:

以上是关于C 调试中的递归线性搜索的主要内容,如果未能解决你的问题,请参考以下文章

向后递归线性搜索

运行递归线性搜索时出现堆栈溢出错误

递归线性搜索的复杂性是多少(使用分而治之的技术)?

C中的递归未排序数组搜索算法?

浅析C#中的线性递归与尾递归

c_cpp 搜索链接列表中的元素(迭代和递归)