了解一种神秘地起作用的递归二进制搜索算法
Understanding a recursive Binary Search Algorithm that mysteriously works
在分配中,我必须使递归二进制搜索算法输出索引,而不是在不修改参数的情况下进行索引。我度过了一个艰难的时期,但是在诉诸半审判之后,我偶然发现了这个混乱:
#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;
}
相关文章:
- 通过递归进行因子分解
- 我的神经网络不起作用 [XOR 问题]
- 递归函数计算序列中的平方和(并输出过程)
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 如果我更改函数输入,我的递归不起作用?
- C++ 使用递归回溯的数独求解器不起作用
- 作用于可变类模板参数的递归函数
- 如果 x,递归不起作用,我的函数只能删除第一个元素
- 了解一种神秘地起作用的递归二进制搜索算法
- 非递归二进制树插入()方法不起作用
- 我用 c++ 编写的递归函数不起作用
- 二叉树递归插入方法不起作用
- 二进制搜索树递归插入导致堆栈溢出,迭代插入不起作用
- 为什么这种递归在c++中起作用?
- 为什么这个C++递归模板不起作用?
- 在Visual Studio 2012中,作用域操作符中的错别字会导致意外的编译和递归
- 如何递归访问父作用域
- 当我尝试使用递归时,我的C++程序不起作用?
- 递归搜索不起作用