【问题标题】:Implementing Radix Sort in SML在 SML 中实现基数排序
【发布时间】: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 &gt; 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


【解决方案1】:

匹配并不详尽,因为它不涵盖仅包含一个元素的列表的情况(归纳起来,任何包含奇数个元素的列表)。

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

【讨论】:

  • 那么我如何表示一个只有一个元素的列表呢?只是sort_nth_digit n a::nil =a 吗?我认为它是无限递归的原因是,当我给函数一些输入时,它没有返回任何输出,我无法在控制台中输入任何进一步的命令。 nth_digit 不应该发散,因为它独立于 sort_nth_digit 正常工作,我看不出从 sort_nth_digit 调用函数会如何改变它?感谢您的回复!
  • 是的,这听起来像是在以某种方式发散。但我不明白你提供的功能是如何造成这种情况的。你能告诉我们你的nth_digit 助手,以及导致分歧的输入吗?
  • 我不知道您是否在我编辑帖子时收到更新,所以仅供参考,我添加了您要求的信息。此外,我认为我修复了非详尽匹配问题。
  • 您的pow 函数是问题所在。当 y
  • 哎呀,现在看起来很明显!非常感谢您的帮助!
猜你喜欢
  • 2016-01-24
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多