我正在尝试实现合并排序算法。我有以下代码:
def merge_sort(array)
if array.length < 2
return array
else
length = array.length
i = array[0..array.length/2-1]
j = array[array.length/2 .. -1]
first = merge_sort(i)
second = merge_sort(j)
sorted_array = []
until first.empty? || second.empty? do
if first[0] >= second[0]
sorted_array << second.shift
else
sorted_array << first.shift
end
end
end
end
我得到一个NoMethodError for NilClass
。
据我了解,unless
块应该检查空数组,并在发生Nil
类之前停止执行。
为什么会出现此错误?
答案 0 :(得分:1)
如果array.length < 2
,则您的merge_sort
将返回array
。否则,merge_sort
将返回until some_condition do ... end
计算得出的结果。碰巧until
的值为nil
,因此您的方法的行为如下:
def merge_sort(array)
if array.length < 2
return array
else
# Do a bunch of stuff...
return nil
end
end
这意味着first
和second
在大多数时间都是nil
,并且有您的NoMethodError
。也许您想在sorted_array
之后返回until
:
def merge_sort(array)
if array.length < 2
array
else
#...
sorted_array = []
until first.empty? || second.empty? do
#...
end
sorted_array # <------------------- sort of important
end
end