SML / NJ新手。制作自定义插入功能

时间:2013-09-13 21:16:03

标签: functional-programming sml smlnj

  

定义一个函数,给定一个列表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)

但是,正如问题所述,我不能将它用作插入函数中的辅助函数。另外,我对如何进行插入功能感到迷茫?任何帮助或指导将不胜感激!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

在这里如何做到这一点。每个递归调用你传递给列表的函数尾部和(k - 1) - 列表尾部的新元素的位置,当列表为空时你构造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索引列表,如果你想要1索引,只需将0替换为1。

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

修改

你可以这样称呼它

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

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