【发布时间】:2022-01-04 14:05:04
【问题描述】:
我正在实现递归二进制搜索,但遇到了这个让我非常困惑的问题。这是我最初运行的代码:
'''
int recursiveBinarySearch(int* arr, int start, int end, int key){
int middle = (start + end) / 2;
if (start >= end)return -1;
if (arr[middle] == key)return middle;
if (arr[middle] < key) {
recursiveBinarySearch(arr, middle+1, end, key);
}
if (arr[middle] > key) {
recursiveBinarySearch(arr, start, middle-1, key);
}
}
'''
现在,据我了解,一旦达到基本情况,唯一返回的应该是从基本情况返回的值,因为没有其他调用返回任何内容。 但是,显然我错了,因为这没有给出正确的答案,而且显然我需要在每个递归调用之前都有一个 return 语句才能使该算法起作用,正如我后来发现的那样。 所以我的问题是,为什么我们需要 return 语句?我的解决方案不起作用的具体原因是什么?
【问题讨论】:
-
函数被声明为返回一个值。在进行递归调用的情况下,您返回了什么值?
-
recursiveBinarySearch()= 调用函数,丢弃结果,return recursiveBinarySearch()= 调用函数,将其结果作为我们的返回值 -
在纸上追踪你在 1,2,3 中搜索 3 的情况,你会明白为什么。
-
int* arrstd::array 或std::vector或在现代 C++ 中使用std::span。但 C++ 标准库实际上会为此使用迭代器。 -
int middle = (start + end) / 2;也是错误的...如果start+end溢出怎么办?
标签: c++ algorithm recursion data-structures return