我正在尝试使用'let in end'包含辅助函数在SML中创建递归气泡排序。
当我为什么不打印任何东西时,我很失落。
main.sml:
val master = [1,2,3,1,4,2,8,3,2,1]: int list;
fun bubblesort ( x : int list) : int list =
let
fun sort [] = []
| sort [a] = [a]
| sort (a::b::c) = if (a < b) then [a]@sort(b::c) else [b]@sort(a::c)
fun issorted [] = true
| issorted [x] = true
| issorted (x::y::t) = x <= y andalso issorted(y::t)
in
sort x;
if issorted x then x else bubblesort x;
x
end;
val result = bubblesort master
结果:
Standard ML of New Jersey v110.78 [built: Thu Aug 31 03:45:42 2017] val master = [1,2,3,1,4,2,8,3,2,1] : int list val bubblesort = fn :int list -> int list =
答案 0 :(得分:2)
问题在于您必须进行必要的思考,就像sort x
使x 突变一样。在您当前的代码中,原始的x
是未排序的if issorted x ...
,它以x
开头的行中使用。如果该bubblesort
未排序,那么您将永远以该原始值调用x
。实际上,由于该代码正试图自行返回x
(通过在in
块的最后一行上插入bubblesort
),您将永远在同一位置调用x
值,即使sort x
已排序。相反,您需要在比较中使用 value val
,最好是先在if
绑定中捕获它,然后返回x
的值,而不是fun bubblesort ( x : int list) : int list =
let
fun sort [] = []
|sort [a] = [a]
|sort(a::b::c) = if (a < b) then a::sort(b::c) else b::sort(a::c);
fun issorted [] = true
| issorted [x] = true
| issorted (x::y::t) = x <= y andalso issorted(y::t);
val y = sort x;
in
if issorted y then y else bubblesort y
end;
本身。以下作品:
- bubblesort master;
val it = [1,1,1,2,2,2,3,3,4,8] : int list
然后:
[a]@sort(b::c)
请注意,我将a::sort(b::c)
替换为更具惯性的{{1}}。