【发布时间】:2019-04-27 01:08:50
【问题描述】:
我有一个数组,其中七个数字从最小到最大排序。我必须编写一个返回特定值索引的递归函数。我不允许使用 while 或 for 循环。我绝对没有办法,也不知道如何解决这个问题。你能给我一些想法吗?
【问题讨论】:
-
二分查找
标签: c++ arrays recursion search
我有一个数组,其中七个数字从最小到最大排序。我必须编写一个返回特定值索引的递归函数。我不允许使用 while 或 for 循环。我绝对没有办法,也不知道如何解决这个问题。你能给我一些想法吗?
【问题讨论】:
标签: c++ arrays recursion search
由于数组已排序,因此问题可能希望您使用二进制搜索而不是线性搜索方法。查找“递归二进制搜索”。它应该可以帮助您解决问题。
来自http://www.fredosaurus.com/notes-cpp/algorithms/searching/rbinarysearch.html的示例代码:
int rBinarySearch(int sortedArray[], int first, int last, int key) {
// function:
// Searches sortedArray[first]..sortedArray[last] for key.
// returns: index of the matching element if it finds key,
// otherwise -(index where it could be inserted)-1.
// parameters:
// sortedArray in array of sorted (ascending) values.
// first, last in lower and upper subscript bounds
// key in value to search for.
// returns:
// index of key, or -insertion_position -1
// if key is not in the array.
if (first <= last) {
int mid = (first + last) / 2; // compute mid point.
if (key == sortedArray[mid])
return mid; // found it.
else if (key < sortedArray[mid])
// Call ourself for the lower part of the array
return rBinarySearch(sortedArray, first, mid-1, key);
else
// Call ourself for the upper part of the array
return rBinarySearch(sortedArray, mid+1, last, key);
}
return -(first + 1); // failed to find key
}
【讨论】:
first 和last 参数并替换为适当的size 参数。这样做可以满足您提出的所有要求。
给定函数签名:
int search(int *sorted, int value, unsigned size)
我们首先测试size 是否为 1,因为这是我们的基本情况。如果size 是1,我们检查一个元素sorted[0],看看它是否等于我们正在寻找的value。如果是,return 0,(唯一的)索引。如果不是return -1则表示“未找到”。
如果size 大于一,我们继续。首先我们计算half,即size / 2。然后我们以减小的大小递归调用自己:
result = search(sorted, value, half);
如果 result 不是 -1 ,则返回它,因为它是我们想要的索引。如果result 是-1,我们继续。我们再次递归调用自己,但这次使用的是我们之前没有测试过的数组的另一半:
result = search(sorted + half, value, size - half);
如果result 不是-1,那么我们返回result 加上 half 大小。如果result 为-1,则只需return -1,因为该值不在数组中。
【讨论】: