Без использования выражений case (которые входят в следующий раздел класса), я не понимаю, почему следующее не выполняет quicksort. Он попадает в петлю где-то и никогда не заканчивается.quicksort in ML
splitAt и append уже прошли проверку, но вот коды для них.
fun append(xs, ys) =
if null xs
then ys
else (hd xs) :: append(tl xs, ys)
fun splitAt(xs : int list, x : int) =
let
fun sp(ys : int list, more : int list, less : int list) =
if null ys
then (more, less)
else
if hd ys < x
then sp(tl ys, more, append(less, [hd ys]))
else sp(tl ys, append(more, [hd ys]), less)
in
sp(xs, [], [])
end
fun qsort(xs : int list) =
if length xs <= 1
then xs
else
let
val s = splitAt(xs, hd xs)
in
qsort(append(#2 s, #1 s))
end
И я получаю ту же проблему, используя присоединять (QSort (# 2 с), QSort (# 1 с)), но я, хотя прежний был лучше стиль, поскольку она требует только одного рекурсию с каждым раундом. Я думаю, я должен сказать, что «splitAt» делит список на большее или равное второму аргументу и меньше, и создает кортеж). Добавить объединяет 2 списка.
PS: Это только проблема практики, а не тест или домашнее задание.
Вам необходимо предоставить код для 'splitAt' и' append'. Если код неисправен, ошибка может быть там. Сказав это - не будет что-то вроде 'append (qsort (# 2 s), qsort (# 1 s))' больше смысла? –