![](/img/trans.png)
[英]Recursive call in binary search tree implementation in Ruby does not occur
[英]recursive binary search in ruby
我一直在学习一些算法,但我找不到我的方法失败的原因。 如果您可以查看代码并了解为什么会发生这种情况。 我真的很感激。
我正在尝试编写一种方法来递归地对数组进行二进制搜索,到目前为止,这就是我的全部代码。
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
我无法重现 OP 报告的异常(因为问题中没有给出产生异常的数据),但主要问题是,因为max_index
是从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
的元素是有序的,从最小到最大。
def recursive_binary_search(arr, target, min_index=0, max_index=arr.size-1)
mid_index = (min_index+max_index)/2
case arr[mid_index] <=> target
when 0 # arr[mid_index] == target
mid_index
when -1 # arr[mid_index] < target
min_index = mid_index + 1
recursive_binary_search(arr, target, min_index, max_index)
when 1 # arr[mid_index] > target
max_index = mid_index - 1
recursive_binary_search(arr, target, min_index, max_index)
end
end
arr = [1,2,3,4,5,6]
arr.each { |target| puts "#{target}: #{recursive_binary_search(arr, target)}" }
1: 0
2: 1
3: 2
4: 3
5: 4
6: 5
如果您的数组已排序,您可以尝试这样的操作:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.