私のクイックソートコードはN(リストのサイズ)のいくつかの値のために働くが、大きな値の(例えば、N = 82031)のOCamlによって返されるエラーは、次のとおり例外Stack_overflowは
Fatal error: exception Stack_overflow.
私は何が間違っていますか?
OCamlが大きな値の再帰関数をサポートしていないという事実のため、反復型を作成するべきですか?
let rec append l1 l2 =
match l1 with
| [] -> l2
| x::xs -> x::(append xs l2)
let rec partition p l =
match l with
| [] -> ([],[])
| x::xs ->
let (cs,bs) = partition p xs in
if p < x then
(cs,x::bs)
else
(x::cs,bs)
let rec quicksort l =
match l with
| [] -> []
| x::xs ->
let (ys, zs) = partition x xs in
append (quicksort ys) (x :: (quicksort zs));;
私は自分自身を再定義するのではなく、List.partitionを使用することもできます。 stdlibのパーティションはtail-recursiveですが、彼女はいません – ghilesZ
ありがとう!試してみます! –