Я новичок в Ruby и только начал изучать язык пару дней назад. В качестве упражнения я попытался реализовать простую быструю сортировку
class Sort
def swap(i,j)
@data[i], @data[j] = @data[j], @data[i]
end
def quicksort(lower=0, upper = @data.length - 1)
return nil if lower >= upper
m = lower
i = 0
((lower+1)..upper).each do |i|
swap(++m, i) if @data[i] < @data[lower]
end
swap(m, lower)
quicksort1(lower, m -1)
quicksort1(m+1, upper)
end
end
Вызов быстрой сортировки, скажем, 10000 целых чисел дает мне ошибку на уровне стека. После поиска в Google я понял, что хвостовая рекурсия еще не поддерживается в Ruby ( вид ). Но потом я нашел следующий фрагмент (из здесь )
def qs(v)
return v if v.nil? or v.length <= 1
less, more = v[1..-1].partition { |i| i < v[0] }
qs(less) + [v[0]] + qs(more)
end
Запуск второго фрагмента отлично работает даже с миллионами целых чисел. Тем не менее, насколько я могу судить, в конце есть хвостовая рекурсия. Так чего я тут не понимаю?