c - 二分查找(递归实现)

标签 c function recursion binary-search

<分区>

我想在递归中编写二进制搜索代码。我首先写下这个:

int rSearch(int numbers[],int start, int end, int x){
    int mid;
    if(start <= end){
        mid = (start + end)/2;
        if(numbers[mid] == x)
            return mid;
        else if(numbers[mid] > x)
            rSearch2(numbers, start, mid-1, x);
        else
            rSearch2(numbers, mid+1, end, x);

    } else
        return -1;
}

而且它工作完美。但是在我搜索之后我明白我必须写这样的代码:

int rSearch2(int numbers[],int start, int end, int x){
    int mid;
    if(start <= end){
        mid = (start + end)/2;
        if(numbers[mid] == x)
            return mid;
        else if(numbers[mid] > x)
            return rSearch2(numbers, start, mid-1, x);
        else
            return rSearch2(numbers, mid+1, end, x);

    } else
        return -1;
}

因为在第一段代码中我们可能没有返回值。
我的问题是为什么第一个代码有效?

最佳答案

欢迎来到未定义行为的精彩世界。在 C 语言中,如果您忘记从函数返回一个值并尝试使用该值,您会得到所谓的未定义行为,这意味着对随后可能发生的事情没有任何要求。完全有可能纯属巧合,代码将在您的系统上运行,但在另一个系统上编译相同的代码可能最终导致相同的代码无法产生正确的值。虽然我无法想象这种情况会发生,但从技术上讲,未定义的行为可能会导致您的程序在播放“江南 Style”的歌词时重新格式化用户的硬盘。

这可能在您的系统上起作用的原因是在许多体系结构上,小的返回值存储在专门的寄存器中,并且返回语句的编译方式是将值加载到该寄存器然后跳出功能。因此,如果您最终在递归链中返回一个值,然后忘记在其他地方返回值,那么该原始值可能巧合地仍在寄存器中,就好像您已正确返回它一样。但是您不能依赖它,如上所述 - 它不可移植。

关于c - 二分查找(递归实现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53685351/

相关文章:

c - 如何删除列表中的第一项?

bash - shell脚本: Indirect recursion doesn't work as expected (too many repetitions)

Java内存分配

python - 如何在 Python 中获取全局变量?

c++ - 仅使用递归在 C++ 中由数字制成的钻石?

c - 在c中不使用printf()打印 float

c - 指针操作和类型转换

c++ - Unix(大端)代码和Linux(小端)上的相同代码,创建不同的输出直径文件

javascript - 在递归函数中首先返回最后一项

python - 无法合并两个已排序的单链表,因为 "type object ' _Node' 没有属性 '_element' "