红宝石中的递归二进制搜索

时间:2018-09-03 20:40:30

标签: ruby recursion binary-search

我一直在学习一些算法,但找不到我的方法失败的原因。如果您可以看一下代码并阐明为什么会这样。我会很感激。

我正在尝试编写一种方法,该方法将以递归方式对数组进行二进制搜索,到目前为止,这就是我的全部代码。

 def recursive_binary_search(arr, target)
   max_index = arr.length - 1
   mid_index = max_index / 2

   if arr[mid_index] > target
     new_arr = arr[0..(mid_index - 1)]
     recursive_binary_search(new_arr, target)
   elsif arr[mid_index] < target
     new_arr = arr[(mid_index + 1)..max_index]
     recursive_binary_search(new_arr, target)
   else
     return mid_index
   end
 end

我不断遇到的错误是undefined method '>' for nil:NilClass

2 个答案:

答案 0 :(得分:1)

我无法重现OP报告的异常(因为未在问题中给出产生异常的数据),但是主要问题在于,因为max_index是根据{{1}计算得出的},并且arr越来越小,该方法返回的索引将与初始数组arr中的正确索引无关。

例如,假设arrarr = [1,2,3,4,5,6]。在这种情况下,该方法将返回target = 6(而不是0)作为目标元素的索引。这是因为5将逐渐变为arrarr[3..6]arr[4..6]arr[5..6],此时将返回索引arr[6]

这是使用0语句编写方法的一种方式。该方法假定casetarget的元素,并且(按二进制搜索的要求)arr的元素是有序的,从最小到最大。

arr

答案 1 :(得分:0)

如果您的数组已排序,您可以尝试这样的操作:

def search(arr, target)
 return nil if array.empty?
 
 mid_index = array.length / 2

 case target <=> array[mid_index]
 when -1
   search(array.take(mid_index), target)
 when 0
   mid_index
 when 1
   subs = search(array.drop(mid_index + 1), target)
   subs.nil? ? nil : (mid_index + 1) + subs
 end

end