递归除法和 impera 二进制搜索中的错误
Posted
技术标签:
【中文标题】递归除法和 impera 二进制搜索中的错误【英文标题】:Bug in recursive divide et impera binary search 【发布时间】:2020-01-15 03:01:30 【问题描述】:我写了一个分而治之的二进制搜索,它适用于所有情况,除了当我搜索第一个或最后一个数字时,它给我的结果不是 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;
【问题讨论】:
这是一个练习调试技能的好机会。启动您选择的调试器并逐行执行程序。对于每一行,检查程序是否执行您手动进行二进制搜索时会执行的操作。 是的,我做到了。调试器说 mij 是 0,就在它返回之前,但我的屏幕打印出 1。 【参考方案1】:您的代码具有未定义的行为,因为您并非在所有情况下都从函数中返回值。您的程序可能会崩溃、什么也不做、格式化您的硬盘驱动器或给您正确的值 - 发生的事情是不确定的。在这种情况下,您的编译器确切地知道问题出在哪里并且真正想告诉您,但您需要问它:打开警告(例如 gcc 或 clang 中的 -Wall
)。
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;
【讨论】:
【参考方案2】:您的二进制搜索工作正常,但您确定您已正确地将输入传递给程序?输入应该是这样的 -
5
1 2 3 4 5
输出
0
你可以在这里验证link to code
【讨论】:
我在学校的电脑上完成了它并传递了确切的输入并使用调试器逐步执行它,mij 在返回之前为 0,但屏幕打印出 1。现在我用我的PC,同样的东西,但它打印出 6422208 @Lastrevio2 浏览了我发布的链接? 是的,我不知道如何在那里输入。 在编译和运行上方有一个带有使用自定义输入来测试你的代码的复选框标签,点击你的输入可以提供给程序。以上是关于递归除法和 impera 二进制搜索中的错误的主要内容,如果未能解决你的问题,请参考以下文章
Python 二进制递归搜索 5.2.6 Binary.py