【问题标题】:New to SML / NJ. Making a custom insert functionSML / NJ 的新手。制作自定义插入功能
【发布时间】:2013-09-18 16:14:57
【问题描述】:

定义一个函数,给定一个列表 L、一个对象 x 和一个正数 整数 k,返回 L 的副本,其中 x 插入到第 k 个位置。 例如,如果 L 是 [a1, a2, a3] 并且 k=2,那么 [a1, x, a2, a3] 是 回来。如果 L 的长度小于 k,则在末尾插入。为了 这种问题,你不应该使用,例如, 长度函数。想想函数如何计算长度。不 'if-then-else' 或任何辅助功能。

我已经想出了如何制作一个函数来查找列表的长度

fun mylength ([]) = 0
| mylength (x::xs) = 1+ mylength(xs)

但是,正如问题所述,我不能将其用作插入功能中的辅助功能。另外,我不知道如何使用插入功能?任何帮助或指导将不胜感激!

【问题讨论】:

    标签: functional-programming sml smlnj


    【解决方案1】:

    这就是我的处理方式。以下假设列表项从零开始。

    fun mylength (lst,obj,pos) =
        case (lst,obj,pos) of
            ([],ob,po)=>[ob]
              | (xs::ys,ob,0) => ob::lst
              | (xs::ys,ob,po) => xs::mylength(ys,obj,pos-1)
    

    【讨论】:

      【解决方案2】:

      这里是如何做到这一点。您传递给列表尾部函数的每个递归调用和 (k - 1) - 新元素在列表尾部的位置。当列表为空时,您构建一个单元素列表(给您);当 k 为 0 时,您将元素附加到列表的剩余部分。在回来的路上,你附加了你之前解包的列表的所有头部。

      fun kinsert [] x k = [x]
        | kinsert ls x 0 = x::ls
        | kinsert (l::ls) x k = l::(kinsert ls x (k - 1))
      

      我使用了一个 0-indexed 列表;如果你想要 1-indexed,只需将 0 替换为 1。

      如您所见,它与您的mylength 函数几乎相同。不同之处在于递归有两种基本情况,而你在返回途中的操作不是+,而是::

      编辑

      你可以这样称呼它

      kinsert [1,2,3,4,5,6] 10 3;
      

      它有 3 个参数;与您的长度函数不同,它不会将参数包装在元组中。

      【讨论】:

      • 如何调用这个函数?我用过 kinsert([3,5,6],4,2);我得到一个类型错误。
      猜你喜欢
      • 2014-07-15
      • 2013-10-20
      • 2013-12-17
      • 2010-10-18
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 2013-11-19
      • 2011-11-24
      相关资源
      最近更新 更多