尝试为反向数组输入实现二进制算法。 当我执行测试用例时 - 5 4 3 2 1 它向我显示一个空白屏幕,即 while 循环无限运行。现在尝试调试它一段时间但无法弄清楚我哪里出错了。
#include <stdio.h>
#include <stdlib.h>
int findright(int arr[], int key, int low, int high);
void main() {
int n, i, arr[200], key;
scanf("%d %d\n", &n, &key);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int a = findright(arr, key, 1, n - 1);
printf("%d", a);
}
int findright(int arr[], int key, int low, int high) {
int mid = (low + high) / 2;
while (low <= high) {
if (arr[mid] == key) {
return mid;
} else if (arr[mid] > key) {
findright(arr, key, mid + 1, high);
} else {
findright(arr, key, low, mid - 1);
}
}
return -1;
}
最佳答案
在你的循环中 while (low <= high) { ...
, low
的值和 high
没有改变;因此,如果循环一旦进入,它将永远不会返回。
当你使用递归时,你将不需要循环:
int findright(int arr[], int key, int low, int high) {
if (low > high) { // anchor stopping recursion
return -1; // indicate that key was not found...
}
int mid = (low + high) / 2;
if (arr[mid] == key) {
return mid;
} else if (arr[mid] > key) {
return findright(arr, key, mid + 1, high);
} else {
return findright(arr, key, low, mid - 1);
}
}
请进一步注意,正如 MFisherKDX 所提到的,“您的 main 中也有一个差一错误。您将 1 作为低值传递,因此永远不会检查第 0 个元素”。
关于c - While Loop 永远运行并且不在二分查找中返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49740573/