了解一种神秘地起作用的递归二进制搜索算法

Understanding a recursive Binary Search Algorithm that mysteriously works

本文关键字:起作用 递归 搜索算法 二进制 一种 了解      更新时间:2023-10-16

在分配中,我必须使递归二进制搜索算法输出索引,而不是在不修改参数的情况下进行索引。我度过了一个艰难的时期,但是在诉诸半审判之后,我偶然发现了这个混乱:

#include <iostream>
#include <math.h>
#include <climits>
using namespace std;

int BinarySearch(int arr[], int len, int target) {
    int temp = 0;
    int mid = len/2;
    if (len <= 0) return INT_MIN;  // not found
    if (target == arr[mid]){
        return mid; // found
    }
    if (target < arr[mid]){
        temp = BinarySearch(arr, mid, target);
    }
    else {
        temp = mid+1 + BinarySearch(arr+mid+1, len-mid-1, target);              
    }
}

即使通过可视化器运行后,我也不知道为什么它可以工作。它对更改的代码非常敏感,当它找不到目标时,我无法将其提交到输出-1,因此我至少使其始终输出一个负数。

我真的不需要修复它,我只想知道它的工作方式,因为似乎没有任何递归电话的输出。谢谢。

它是未定义的行为(例如,请参见为什么在不返回值的情况下流出非流动函数的末端,而不会产生编译器错误?(。

编译器似乎偶然地返回 temp ,可能是因为它是函数内部声明的第一个局部变量。返回 temp 将修复它。

据我所知,如果找不到目标,则要返回-1,而目标的索引。在

if (len <= 0) return INT_MIN;  // not found

如果找不到目标,您将返回INT_MIN。您需要将其更改为

if (len <= 0) return -1;  // not found

由于您的功能返回int值,因此必须在每个补丁上返回某些内容。您可以通过在功能末尾添加return来解决它:

    if (target < arr[mid]){
        temp = BinarySearch(arr, mid, target);
    }
    else {
        temp = mid+1 + BinarySearch(arr+mid+1, len-mid-1, target);              
    }
    return temp;
}

BinarySearch在当前arr中返回target的索引。由于当前的arr通常不从索引0开始,因此您正在添加和减去mid+1。如果找不到目标并且BinarySearch返回-1,则您也这样做。您必须修复else部分:

else {
    int index(BinarySearch(arr+mid+1, len-mid-1, target));
    temp = index == -1 ? -1 : mid + 1 + index;              
}