ruby中的递归二进制搜索

ruby中的递归二进制搜索,ruby,recursion,binary-search,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

我一直在学习一些算法,但我找不到我的方法失败的原因。如果你能看看代码,了解一下为什么会发生这种情况。我将非常感激

我正在尝试编写一个递归二进制搜索数组的方法,到目前为止,这就是我的全部代码

 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
def递归二进制搜索(arr,目标)
最大索引=arr.length-1
中间指数=最大指数/2
如果arr[mid_索引]>目标
新的arr=arr[0..(中间索引-1)]
递归二进制搜索(新arr,目标)
elsif arr[中间索引]<目标
新的arr=arr[(中间指数+1)…最大指数]
递归二进制搜索(新arr,目标)
其他的
返回中间索引
结束
结束

我一直得到的错误是nil:NilClass的
undefined method'>我无法重现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递归二进制搜索(arr,目标,最小索引=0,最大索引=arr.size-1)
中间指数=(最小指数+最大指数)/2
案例arr[中间指数]目标
当0#arr[mid_index]==目标时
中期指数
当-1#arr[mid_index]目标
最大指数=中间指数-1
递归二进制搜索(arr、目标、最小索引、最大索引)
结束
结束
arr=[1,2,3,4,5,6]
arr.each{124; target}放置“{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
def搜索(arr,目标)
如果array.empty返回nil?
中间索引=array.length/2
案例目标阵列[中间索引]
当-1
搜索(array.take(mid_索引),目标)
当0
中期指数
当1
subs=搜索(array.drop(mid_index+1),目标)
subs.nil?无:(中_指数+1)+subs
结束
结束

如果你去掉粘贴代码中的行号,这样我们就可以在此基础上构建解决方案,而不必这样做,这会有很大帮助。请记住,在尝试解决此类问题时,通常最好先创建一个或多个测试用例,然后再编写代码。您的测试用例有助于定义您试图解决的问题的参数,并确定您何时有解决方案。例如
arr
target
以及相关的预期输出可以帮助人们给出答案。以下是一些关于问题构造的建议。1.首先用文字陈述你的问题(倒转前两段)。2.读者可能希望运行您的代码,无论有无修改。第一步是剪切和粘贴。这里需要第二步来删除行号。最好只显示代码,不显示行号、IRB提示等。3.如果您给出了一个导致您提到的异常的示例,这会很有帮助……当您给出一个示例时(更一般地说),将所有内容都设置为有效的Ruby对象(无
…(等)
,例如,使示例尽可能简洁,为每个输入对象分配一个变量(例如,
arr=[1,2,3]
)因此,读者可以在答案和注释中引用这些变量,而无需定义它们,并显示所需的结果(作为Ruby对象)。要重现错误:
arr=[0,1]
target=2