我的快速排序代碼適用於的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的分區是尾遞歸的,而她的不是 – ghilesZ
謝謝!我會嘗試! –