ケースの表現(クラスの次のセクションにあります)を使用せずに、私はクイックソートをやっていない理由を理解できません。それはどこかのループに入り、決して終わらない。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 S))追加使用して同じ問題を取得しますが、私前者はそれだけで各ラウンドを持つ単一の再帰を必要とするため、より良いスタイルでしたが。 私は 'splitAt'はリストを2番目の引数よりも大きく、2番目の引数よりも小さく、そしてより小さい、そしてタプルを作成すると言うべきだと思います。 Appendは2つのリストを連結します。
PS:これは練習問題であり、テストや宿題ではありません。
'splitAt'と' append'のコードを提供する必要があります。コードがバグの場合、バグが存在する可能性があります。それを言いました - 'append(qsort(#2 s)、qsort(#1 s))のようなものではないでしょうか? ' –