排序 SML 列表时出现问题
Issue in sorting SML list
我是新手 SML.I 得到了这个排序算法来实现每次迭代的位置,我必须从列表中选择最小元素,将其删除并创建排序列表。
我做了下面的编码来解决这个问题。
我编写了 2 个辅助函数来从列表中选取最小元素并从列表中删除一个元素。
fun minList(x::xs) =List.foldl (fn (x,y)=> if x<y then x else y) x (x::xs);
fun remElem(x, l) =
case l of
[] => []
| (x1::x2::xs) => if x1=x then (x2::xs) else (x1::xs)
;
以上两个程序运行成功。
下面是我的排序代码。
fun simpSort(xs)=
let fun aux(xs,acc)=
case xs of
[] =>acc
| [x] => [x]
| (x::xs) => let val m = minList(xs)
in
aux(remElem(m,xs),acc@[m])
end
in aux(xs,[])
end;
此排序程序出错。
simpSort([3,1]);
未捕获的异常匹配[非穷尽匹配失败]
提出于:stdIn:433.59
请指教
既然你已经解决了你的问题,这里有一些改进代码工作版本的提示:
以支持空列表的方式查找列表的最小值:
fun minimum [] = NONE
| minimum (x::xs) = SOME (foldl Int.min x xs)
简化从列表中删除第一次出现的元素的函数中的模式匹配:
fun remove (_, []) = []
| remove (y, x::xs) =
if x = y
then xs
else x :: remove (y, xs)
将它们组合起来写成simpSort
:
fun simpSort xs =
case minimum xs of
NONE => []
| SOME x => x :: simpSort (remove (x, xs))
我不应该说这种排序算法非常低效。 :-P
我是新手 SML.I 得到了这个排序算法来实现每次迭代的位置,我必须从列表中选择最小元素,将其删除并创建排序列表。
我做了下面的编码来解决这个问题。
我编写了 2 个辅助函数来从列表中选取最小元素并从列表中删除一个元素。
fun minList(x::xs) =List.foldl (fn (x,y)=> if x<y then x else y) x (x::xs);
fun remElem(x, l) =
case l of
[] => []
| (x1::x2::xs) => if x1=x then (x2::xs) else (x1::xs)
;
以上两个程序运行成功。
下面是我的排序代码。
fun simpSort(xs)=
let fun aux(xs,acc)=
case xs of
[] =>acc
| [x] => [x]
| (x::xs) => let val m = minList(xs)
in
aux(remElem(m,xs),acc@[m])
end
in aux(xs,[])
end;
此排序程序出错。
simpSort([3,1]);
未捕获的异常匹配[非穷尽匹配失败] 提出于:stdIn:433.59
请指教
既然你已经解决了你的问题,这里有一些改进代码工作版本的提示:
以支持空列表的方式查找列表的最小值:
fun minimum [] = NONE | minimum (x::xs) = SOME (foldl Int.min x xs)
简化从列表中删除第一次出现的元素的函数中的模式匹配:
fun remove (_, []) = [] | remove (y, x::xs) = if x = y then xs else x :: remove (y, xs)
将它们组合起来写成
simpSort
:fun simpSort xs = case minimum xs of NONE => [] | SOME x => x :: simpSort (remove (x, xs))
我不应该说这种排序算法非常低效。 :-P