我一直在学习一些算法,但找不到我的方法失败的原因。如果您可以看一下代码并阐明为什么会这样。我会很感激。
我正在尝试编写一种方法,该方法将以递归方式对数组进行二进制搜索,到目前为止,这就是我的全部代码。
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
答案 0 :(得分:1)
我无法重现OP报告的异常(因为未在问题中给出产生异常的数据),但是主要问题在于,因为max_index
是根据{{1}计算得出的},并且arr
越来越小,该方法返回的索引将与初始数组arr
中的正确索引无关。
例如,假设arr
和arr = [1,2,3,4,5,6]
。在这种情况下,该方法将返回target = 6
(而不是0
)作为目标元素的索引。这是因为5
将逐渐变为arr
,arr[3..6]
,arr[4..6]
和arr[5..6]
,此时将返回索引arr[6]
。
这是使用0
语句编写方法的一种方式。该方法假定case
是target
的元素,并且(按二进制搜索的要求)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