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