我正在尝试通过一系列辅助函数在 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 文件)