首页 文章

如何在递归函数中使用if-then-else

提问于
浏览
0

我正在编写一个函数,它将获取列表列表并将其合并到已排序的列表对中 . 例如[[1],[9],[8],[7],[4],[5],[6]]将返回[[1,9],[7,8],[4,5] ],[6] . 这是我第一次尝试SML . 我一直收到这个错误:运算符和操作数不同意[过载冲突] .

fun mergePass[] = []
    |   mergePass(x::[]) = x::[]
    |   mergePass(x::y::Z) = 
        if x<y
        then (x @ y)::mergePass(Z)
        else (y @ x)::mergePass(Z);

编辑:如果在[[1,9],[7,8],[4,5],[6]]上调用mergePass,我将需要它返回[[1,7,8,9],[4, 5,6] .

此合并函数采用两个排序列表

fun merge([],y) = y
   |   merge(x,[]) = x
   |   merge(a::x,b::y) =
   if a < b then a::merge(x,b::y)
   else b::merge(a::x,y);

1 回答

  • 1

    你似乎相当接近 . 一些提示/评论:

    1)在美学上,在一行中使用 nil 而在其他行中使用 [] 似乎很奇怪 . 使用全部 nil 或全部使用 []

    2)由于输入是列表列表,在 x::y::z 中,标识符 xy 将是整数列表,而不是单个整数 . 因此, x<y 不会使用 < 来比较整数列表 .

    3)您的问题描述强烈建议内部列表都是1元素列表 . 因此,您可以使用模式 [x]::[y]::z 来比较 xy . 在这种情况下, x@y 可以被 [x,y] 替换

    4)如果允许内部列表具有任意大小,那么您的代码需要进行重大修订,并且可能需要一个完整的排序函数来对连接内部列表对的结果进行排序 . 此外,在这种情况下,应该对一个内部列表情况中的单个列表进行排序 .

    5)你有一个拼写错误: mergeP 不是 mergePass .

    On Edit

    如果每个子列表都已排序(并且整个函数的名称可能暗示了这一点)那么你需要一个名为eg的函数 . merge 将采用两个排序列表并将它们组合成一个排序列表 . 如果这是一个类,你已经看到一个 merge 函数作为一个例子(可能在合并排序的讨论中) - 只需使用它 . 否则,在编写此函数之前,您必须自己编写 . 一旦你有了合并功能,跳过比较 xy 的部分,而是有一些简单的东西:

    | mergePass (xs::ys::zss) = (merge xs ys) :: mergePass zss
    

    如果子列表未合并,那么您将需要一个完整的排序,在这种情况下,您将使用以下内容:

    | mergePass (xs::ys::zss) = sort(xs @ ys) :: mergePass zss
    

相关问题