我试图通过一系列辅助函数在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文件)
答案 0 :(得分:0)
匹配并非详尽无遗,因为它不包括仅包含一个元素的列表(以及归纳地,任何具有奇数元素的列表)。
我不确定你的意思是“没有得到答案”。除非你的nth_digit
助手这样做,否则这个函数不会发散(无限递归)。相反,由于上述情况,当您将奇数长度的列表提供给它时,您应该获得Match
例外。