这应该只是一个愚蠢的小问题(如果我能说得好)。在查看我教授的示例并观看YouTube视频时,我注意到当人们设置二进制搜索时,他们会DECLARE但不会为数组位置定义变量(例如,第一,中,最后或低,中,高)。
教授的例子:
int bsearch(const int list[], int first, int last, int searchItem){
if(first <= last){
int mid = (first + last) / 2;
.......
如果没有为first / last / mid设置值,如何/为什么这样做?
好的,这些反应是有道理的。但是,在我教授的例子中,我很难理解这种情况发生的地方。我看到他在哪里返回bsearch()我认为仍然是未定义的参数,后来调用binarySearch(),但只有3个参数。我看到我被贬低了;我不确定这个人希望我转向编程问题的原因或位置。无论如何这里是完整的代码:
#include <iostream>
using namespace std;
int bsearch(const int list[], int first, int last, int searchItem)
{
if(first <= last) {
int mid = (first + last) / 2;
if(list[mid] == searchItem)
return mid;
else
if(list[mid] > searchItem)
return bsearch(list, first, mid-1, searchItem);
else
return bsearch(list, mid+1, last, searchItem);
}
else
return -1;
}
// Non-recursive shell for the recursive binary search function.
// This function does not use "first" and "last" as its parameters.
int binarySearch(const int list[], int listLength, int searchItem)
{
return bsearch(list, 0, listLength-1, searchItem);
}
int main() // testing recursive binarySearch function
{
int a[] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
int item;
cout << "Search item? ";
cin >> item;
cout << binarySearch(a, 10, item) << endl;
return 0;
}
答案 0 :(得分:3)
我们使用第三行的语句定义mid
:
int mid = (first + last) / 2;
至于其他人,我们通过调用函数来定义first
和last
。例如:
a = bsearch(my_list, 1, 100, 55);
根据int bsearch(const int list[], int first, int last, int searchItem)
这相当于说
int first = 1;
int last = 100;
int searchitem = 55;
我们这样做的部分原因是因为我们并不总是希望为每个二进制搜索定义相同的值,但更重要的是它允许我们调用二进制搜索recursively。
让我们按照函数调用,看看会发生什么!
在main()
我们有这行代码:
cout << binarySearch(a, 10, item) << endl;
当我们查看binarySearch时,函数的结构如下:
int binarySearch(const int list[], int listLength, int searchItem)
根据前面的例子,您也可以将其视为
const int list[] = a; //for now you can think of it as "= (the contents of a)", though it works a little different in reality
int listLength = 10;
int searchItem = item;
但现在我们进行另一个函数调用:
return bsearch(list, 0, listLength-1, searchItem);
但是等等!基于我们的上一个例子,并且知道bsearch(bsearch(const int list[], int first, int last, int searchItem)
)的结构,我们可以看到这些变量也被定义了!
在某种程度上,你可以这样想到它!
//== main() ==
int a[] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
int item;
cin >> item;
//== int const list[] v v int searchItem ==
//== binarysearch(a, 10, item) ==
//== int listLength ^ ==
const int list[] = a;
int listLength = 10;
int searchItem = item;
//== int const list[] v v int last ==
//== bsearch(list, 0, listLength -1, searchItem) ==
//== int first ^ ^ int searchItem ==
const int list_bsearch = list;
int first = 0;
int last = listLength -1;
int searchItem_bsearch = searchItem;
SO ,我们定义searchItem
的方式,例如,您只需按照定义。
searchItem(bsearch)= searchItem(binarySearch)= item
注意binarySearch和bsearch是具有不同参数的不同函数。背后的原因&#34;为什么这样做&#34;与递归有关,完全值得另一个问题。
这是一个非常简单的例子:
int fooAdd(int a, int b){
//a and b are ints
//by calling fooAdd(2, five) we set a = 2, and b = five (which was an int that happened to have the bvalue 5;
return a +b;
}
int main(){
int five = 5;
cout << fooAdd(2, five);
return 0;
}
P.S。对你的回应&#34;我看到我被投票了;我不确定这个人希望我转向编程问题的原因和位置,并且#34;讽刺。
堆栈溢出的许多人喜欢帮助你,但有时问题不是以非常清晰的方式写出来的,或者有太多的迷你问题无法真正帮助你。
不要以为通过贬低,我们会劝阻你不要提问。试着想象一下如何提出你的问题更好!
答案 1 :(得分:0)
变量在调用时传入函数。例如:
int main()
{
int list[] = [1,2,3,4,5];
cout << bsearch(list, 0, 4, 2);
return 0;
}
答案 2 :(得分:0)
我猜提供的函数是递归。因此,在输入递归(函数调用本身)之前,你必须从其他地方调用该函数(例如:你从main调用bsearch,然后它在main中,first和last设置为某些值)
int main ()
{
bsearch(list, 0, 4, 2);
}