递归除法和二分搜索中的错误
Bug in recursive divide et impera binary search
我写了一个分而治之的二叉搜索,它适用于所有情况,除了当我搜索第一个或最后一个数字时,它不是给我 0 和 v.size((-1 作为结果,而是给我 1 和 v.size((-2。
例如,如果我输入 n=5 和向量 {1; 2; 3; 4; 5} 并搜索 1,它会返回"1"而不是"0"。
#include <iostream>
#include <vector>
using namespace std;
int binarySearch(std::vector<int> v, int nr, int left, int right)
{
int mij = (left + right) / 2;
if (v[mij] < nr){
binarySearch(v, nr, mij+1, right);
}
else if (v[mij] > nr){
binarySearch(v, nr, left, mij-1);
}
else if (v[mij] == nr){
return mij;
}
else return -1;
}
int main()
{
vector <int> v;
int n; cout << "n="; cin >>n;
for (int i = 0; i < n; i++){
int x;
cout << "v[" << i << "]=";
cin >> x;
v.push_back(x);
}
cout << binarySearch(v, 1, 0, v.size());
return 0;
}
您的代码具有未定义的行为,因为您不会在所有情况下都从函数返回值。您的程序可能会崩溃,什么都不做,格式化硬盘驱动器或为您提供正确的值 - 无法定义会发生什么。在这种情况下,您的编译器确切地知道问题是什么,并且真正想告诉您,但您需要问它: 打开警告(例如-Wall
在 gcc 或 clang 中(。
warning: control may reach end of non-void function [-Wreturn-type]
目前,如果您递归,则不会返回值,这很容易修复:
int binarySearch(std::vector<int> v, int nr, int left, int right)
{
int mij = (left + right) / 2;
if (v[mij] < nr){
return binarySearch(v, nr, mij+1, right);
// ^^^^^^
}
else if (v[mij] > nr){
return binarySearch(v, nr, left, mij-1);
// ^^^^^^
}
else if (v[mij] == nr){
return mij;
}
else return -1;
}
您的二叉搜索工作正常,但您确定已正确将输入传递给程序? 输入应该是这样的 -
5
1 2 3 4 5
输出
0
您可以在此处验证代码链接
相关文章:
- 使用不变量来确定二分搜索中的边界条件
- 提升图广度优先搜索前置编译错误
- 在二叉搜索树中插入时出现分段错误
- 基于函数而不是集合的二分搜索或迭代器?
- C++:使用类在向量中搜索特定元素时,我得到了错误的结果
- UVA 10077 - 为什么是二分搜索?
- 二叉搜索树的 C++ 实现中的EXC_BAD_ACCESS错误
- 为什么二叉搜索函数会抛出错误?
- 编译时二叉搜索树错误的反向迭代器表示"no matching function call for operator=()"
- 简单的二分搜索对我不起作用。我正在尝试从文本文件中搜索单词
- 递归除法和二分搜索中的错误
- 用于二分搜索的错误简单功能(C++)
- 按字母顺序对数组进行二分搜索和排序 C++.
- 是否可以使用 lower_bound() 对结构的普通数组进行二分搜索
- 对带/不带提升的函数参数进行二分搜索
- 在 c++ 中对向量<结构 S> 进行二分搜索?
- 涉及向量的二分搜索出现问题(c++)
- 二分搜索,"midpoint"占三分之一
- 二分搜索算法采用迭代和递归
- 纠正我的次优二分搜索