【问题标题】:find element in sorted array without using for or while在排序数组中查找元素而不使用 for 或 while
【发布时间】:2019-04-27 01:08:50
【问题描述】:

我有一个数组,其中七个数字从最小到最大排序。我必须编写一个返回特定值索引的递归函数。我不允许使用 while 或 for 循环。我绝对没有办法,也不知道如何解决这个问题。你能给我一些想法吗?

【问题讨论】:

  • 二分查找

标签: c++ arrays recursion search


【解决方案1】:

由于数组已排序,因此问题可能希望您使用二进制搜索而不是线性搜索方法。查找“递归二进制搜索”。它应该可以帮助您解决问题。

来自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
}

【讨论】:

  • 非常感谢,问题是我只能给函数提供三样东西:排序数组。查找的值和数组的大小。这使得这项任务非常复杂
  • @ArthurJohnson,在这种情况下,我认为这个线程可以帮助你stackoverflow.com/questions/8392637/…它是在java中,但逻辑应该很容易转移。
  • 这让这项任务变得非常复杂 -- 真的没有。第一个参数可以是指向已排序值序列的指针——无论指针是否位于原始排序数组的中间、原始排序数组的开头等等——它只是一个指向一系列排序值。这个答案的问题是每次递归调用总是通过原始数组的开头。只要改变这个缺陷,你基本上就知道了。
  • 谢谢你,保罗,但是递归调用每次总是通过原始数组的开头是什么意思。如何使函数在每次调用时从数组中的另一个位置开始
  • @ArthurJohnson 从概念上看 - 在每次迭代中,原始数组的一半被“丢弃” - 不需要(如答案的代码所做的那样)传递指向每次都整个数组,因为它的一半被丢弃而不是搜索的一部分。所以只需传递数组中仍在搜索中的部分的开头,并丢弃firstlast 参数并替换为适当的size 参数。这样做可以满足您提出的所有要求。
【解决方案2】:

给定函数签名:

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,因为该值不在数组中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多