【发布时间】:2014-03-23 20:20:01
【问题描述】:
我正在尝试通过一系列辅助函数在 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 文件)
【问题讨论】:
-
所以我找到了一个解决方案,它有点草率并且没有修复我原来的解决方案,但它是:
fun bucket d n [] = [] | bucket d 0 L = [] | bucket d n (a::L) = if ((nth_digit a n) = d) then a::(bucket d n L) else bucket d n L'fun sort_nth_digit 0 L = [] | sort_nth_digit n [] = [] | sort_nth_digit n L = if n > 9 then [] else (bucket 0 n L)@(bucket 1 n L)@(bucket 2 n L)@(bucket 3 n L)@(bucket 4 n L)@(bucket 5 n L)@(bucket 6 n L)@(bucket 7 n L)@(bucket 8 n L)@(bucket 9 n L)
标签: sorting sml smlnj ml radix-sort