0

我正在尝试通过一系列辅助函数在 SML 中实现基数排序。我遇到问题的辅助函数称为 sort_nth_digit,它需要一个要排序的数字位置和一个要排序的列表(分别为 n 和 L)。我这样做的方法是找到列表的前两个元素(现在我们可以假设至少有 3 个),按数字 n 比较它们,然后以正确的顺序将它们连接回列表中。该列表应按升序排序。现在,问题:函数编译,但我得到以下信息:

HW4.sml:40.5-44.30 警告:匹配非穷举 (0,L) => ... (n,nil) => ... (n,a :: b :: L) => ...

val sort_nth_digit = fn : int -> int list -> int list

此外,当您传递参数时,您没有得到我认为表明无限递归的答案?

问:匹配如何不详尽,为什么我会无限递归:

 fun sort_nth_digit 0 L = []
|   sort_nth_digit n [] = []
|       sort_nth_digit n (a::b::L) = if ((nth_digit a n) < (nth_digit b n)) then a::b::(sort_nth_digit n L)
        else
            b::a::(sort_nth_digit n L)

我在这里先向您的帮助表示感谢!(*我在stackoverflow上的第一篇文章^.^ *)

非详尽匹配修复:

fun sort_nth_digit 0 L = []
|   sort_nth_digit n [] = []
|       sort_nth_digit n (a::[]) = a::[]
|       sort_nth_digit n (a::b::L) = if ((nth_digit a n) < (nth_digit b n)) then a::b::(sort_nth_digit n L)
        else
            b::a::(sort_nth_digit n L) 

没有输出的输入,控制台就在这一行:

- sort_nth_digit 1 [333,222,444,555,666,444,333,222,999]; 

nth_digit 和匿名助手 pow 的代码:

fun nth_digit x 0 =  0
|   nth_digit x n = if (num_digits x) < n then 0
        else 
            let 
                fun pow x 1 = x
                |   pow x y= x * pow x (y-1)
            in
(*Finding the nth digit of x: ((x - x div 10^n) * 10^n div 10^n-1))*)
            (x - ((x div pow 10 n) * pow 10 n)) div (pow 10 (n-1))  (*Me*)
            end

如果有人认为访问我的其余代码会很有用,我可以通过 github 将其作为 Eclipse 项目提供(如果您没有为 sml 设置 Eclipse,则只需拉取 .sml 文件)

4

1 回答 1

0

匹配并不详尽,因为它不涵盖只有一个元素的列表(并且归纳地,任何具有奇数个元素的列表)的情况。

我不确定您所说的“没有得到答案”是什么意思。nth_digit除非您的助手这样做,否则此函数不会发散(无限递归) 。Match相反,由于上述原因,当您向它提供一个奇数长度的列表时,您应该得到一个异常。

于 2014-02-22T08:33:06.737 回答