【问题标题】:Why does binary search algorithm require returning the recursive calls?为什么二进制搜索算法需要返回递归调用?
【发布时间】: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* arr std::array 或 std::vector 或在现代 C++ 中使用 std::span。但 C++ 标准库实际上会为此使用迭代器。
  • int middle = (start + end) / 2; 也是错误的...如果start+end 溢出怎么办?

标签: c++ algorithm recursion data-structures return


【解决方案1】:

假设,X 是我们从主函数调用的函数。还有一个函数Y 被函数X 调用。函数Y 进行一些计算并计算X 的结果。所以你应该调用函数Y 并返回它的结果,如下所示。

Y() {
 // Some computation
 return result;
}

X() {
 return Y();
}

main() {
  res = X();
}

现在可以这样想,每个递归调用都是一个单独的函数,它正在执行某些任务。所以你的recursiveBinarySearch 函数应该返回答案,但它不能自己计算,所以它正在调用其他一些函数(在这种情况下是相同的函数,因此调用递归)来获得结果。所以它会继续调用函数并将问题分解成更小的问题,直到它到达它会得到答案并最终返回它的基本情况。

【讨论】:

  • 你给出的例子有点奇怪,因为X() 的返回值无论如何都会被main 忽略。
  • 我只是试图说明我的观点以帮助他轻松理解递归。我想他明白了。但我正在修改它以供将来参考@Stef
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 2019-03-02
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多