我在查看在线维基时创建了二进制搜索。我有一个Athletes类,每个都有一个名字和编号。我输入文件文本或csv,并不重要 - 每个运动员的姓名和号码。我的程序首先对它们进行排序,然后我尝试添加基于用户输入搜索数字的功能,并显示谁穿着那个编号的球衣。所以我的最初帖子是试图二元搜索具有相同数字的人。就像在我的名单上,如果我有迈克尔乔丹和勒布朗詹姆斯,他们都穿23 - 所以当我的搜索通过它只会输出1(无论它是第一个)。我一直在寻找如何使我的搜索(下面)接受/找到多次出现的数字。但是,经过进一步的测试,我发现如果我输入的数字实际上并不在我的列表中,它会给我一个错误:search: stack level too deep
我不知道这意味着什么。我认为如果没有数字实例,或者数组为0,我的搜索就无法正常处理。
所以我正在寻找一些帮助,看看如果用户输入的数字不在列表中,我怎么能解决这个问题。所以如果有人输入" 1000" - 没有人穿过那件球衣号码,应该归还假。或类似的东西,休息,无论如何。
def search(array, num, start = 0, last = nil)
if last == nil
last = array.count - 1
end
mid = (start + last) / 2
if num < array[mid].number
return search(array, num, start, mid - 1)
elsif num > array[mid].number
return search(array, num, mid + 1, last)
else
return mid
end
end
我现在也==: stack level too deep
if last == nil
答案 0 :(得分:1)
这不是红宝石的做事方式。当你有一个集合,并且你只想根据某个条件选择其中一些时,ruby方法就是使用Enumerable#select
理想情况下,你会有一些像这样的运动员
athletes = [Athlete.new, Athlete.new]
athletes_with_number_23 = athletes.select { |athlete| athlete.number == 23 } #if you want all
first_athlete_wearing_23 = athletes.detect { |athlete| athlete.number == 23 } #if you want only the first one
免责声明:这是伪代码。
答案 1 :(得分:0)
我改变了搜索功能:
def search(array, key)
lo = 0
hi = array.length-1
while(lo <= hi)
mid = lo + ((hi-lo)/2)
if array[mid].number == key
return mid
elsif array[mid].number < key
lo = mid + 1
else
hi = mid - 1
end
end
puts "Value not found in array"
end
答案 2 :(得分:0)
如果我说得对,你想让所有具有特定号码的运动员进入排序列表。
首先。你的代码过于程序化,“这不是做事的红宝石方式。”但我想这对你没关系。
所以,我建议你找到其中一名运动员的指数,然后从它左右走动阵列来收集相同数量的运动员。
这是我的程序版本。它使用你的功能。
def athletes_with_number(athletes, number)
result = []
found_index = search(athletes, number)
return result unless found_index
# walk left
i = found_index
while i >= 0 && athletes[i].number == number
result << athletes[i]
i -= 1
end
# walk right
i = found_index + 1 # athletes[found_index] already added
while i < athletes.size && athletes[i].number == number
result << athletes[i]
i += 1
end
result
end
def search(array, key)
lo = 0
hi = array.length-1
while(lo <= hi)
mid = lo + ((hi-lo)/2)
if array[mid].number == key
return mid
elsif array[mid].number < key
lo = mid + 1
else
hi = mid - 1
end
end
nil
end