【问题标题】:Custom comparator sort in SML?SML中的自定义比较器排序?
【发布时间】:2021-03-23 09:22:26
【问题描述】:

我在 SML / SMLNJ 中遇到了这个问题,我希望得到一些指导。 所以我有一个问题,我需要创建一个名为 insertSorted 的函数,它需要一个数字、一个比较语句和一个需要插入的(假定排序的)列表。我不知道如何着手解决这个问题,所以任何帮助都会很棒。

我的想法是将两个列表拆分到数字所在的位置,插入数字,然后连接两个列表。

fun insertSorted (x, comp, []) = [x] 
  |  insertSorted (x, comp, a::rest) = ...

更新:我现在走得更远了,我只需要知道如何调试它,有什么指导吗?

fun insertSorted (x, []) = [x]
 |  insertSorted (x, y::ys) = 
    if (x < y)
        then x::y::ys
    else if (x > y) 
        then y::x::ys
    else y::insertSorted (x, ys);

更新 2:我的新目标是弄清楚如何将这两个函数合并为一个。最终命名为 insertSorted。

fun insertSorted (x, nil) = [x]
 |  insertSorted (x,y::ys) = if x<y then x::y::ys else y :: insertSorted (x,ys);

fun insertSorted (x, nil) = [x]
 |  insertSorted (x,y::ys) = if x>y then y::x::ys else y :: insertSorted (x,ys);

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    分三种情况:

    1. 列表是nil
      • 您已经了解了这一点。 :-)
    2. 列表不是nil,并且它的第一个元素小于x,所以我们需要不断寻找在哪里插入x
      • 在这种情况下,结果应该是第一个元素,然后是插入 x 到列表其余部分的结果。
    3. 列表不是nil,它的第一个元素大于等于x,所以我们可以在这里插入x
      • 在这种情况下,结果应该是x,后跟整个列表。

    区分案例#2和#3涉及if/then/else;实现案例 #2 涉及递归。

    【讨论】:

    • 非常感谢您花时间回答!我的一个问题是我如何通过比较。我测试它的代码如下:'insertSorted(5, fn(a, b) => a
    • @MasonGarcia:对不起,我不明白你的问题。 “我怎么能通过比较”是什么意思?
    • 您的测试代码准确显示了如何执行此操作。 fn(a, b) =&gt; a &lt; b 是一个函数,它接受一对值并返回第一个值是否小于第二个值。 (顺便说一下,它是一个函数,或函数表达式,而不是语句。标准ML实际上没有“语句”,但是它最接近的类似物是“声明”,但事实并非如此。)
    • @MasonGarcia:考虑函数fun double i = 2 * i,它接受一个整数并返回双倍(例如double 36)。你不会找到关于整数i 的任何文档,因为它不是一个特定的整数;它只是一个函数参数,可以是 any 整数。同样,在您的情况下,comp 不是特定功能;它只是一个函数参数,可以是int * int -&gt; bool类型的任何函数。
    • (如果这个概念对您来说是新概念并且您难以理解它,请查看"First-class function" on Wikipedia。)
    猜你喜欢
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    相关资源
    最近更新 更多