Bubblesort实现中的无限循环

时间:2019-03-03 01:59:08

标签: sml

我正在尝试使用'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
=

My code

1 个答案:

答案 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}}。