在SML中实现Radix排序

时间:2014-02-22 03:39:27

标签: sorting sml smlnj ml radix-sort

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

HW4.sml:40.5-44.30警告:匹配nonexhaustive           (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&amp;的代码匿名助手战俘:

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文件)

1 个答案:

答案 0 :(得分:0)

匹配并非详尽无遗,因为它不包括仅包含一个元素的列表(以及归纳地,任何具有奇数元素的列表)。

我不确定你的意思是“没有得到答案”。除非你的nth_digit助手这样做,否则这个函数不会发散(无限递归)。相反,由于上述情况,当您将奇数长度的列表提供给它时​​,您应该获得Match例外。