Sml 删除列表的第i个元素

Sml 删除列表的第i个元素,sml,smlnj,ml,Sml,Smlnj,Ml,编写一个函数,删除列表的第i个元素。如果列表的长度小于i,则返回列表 这是所需的输出: - deleteIth([1,2,3,4,5,6],3); val it = [1,2,4,5,6] : int list - deleteIth([1,2,3,4,5,6],7); val it = [1,2,3,4,5,6] : int list 这是我的密码: fun deleteIth (L, i) = let (* Deletes the element of a lis

编写一个函数,删除列表的第i个元素。如果列表的长度小于i,则返回列表

这是所需的输出:

- deleteIth([1,2,3,4,5,6],3);
val it = [1,2,4,5,6] : int list

- deleteIth([1,2,3,4,5,6],7);
val it = [1,2,3,4,5,6] : int list
这是我的密码:

fun deleteIth (L, i) =
    let
        (* Deletes the element of a list at ith index *)
        fun delete (nil, i, position) = nil
        | delete (x::xs, i, position) = if i = position then xs else 

x :: delete (xs, i, position + 1)
        in
            if i >= 0 andalso i < length L then delete (L, i, 0) else L
        end;

非常感谢您的帮助。

既然您已经得到了预期的结果,下面是一个较短的版本,它只遍历列表一次,并且不会超出要删除的元素。
length
必须遍历整个列表以确定其长度。它可能是最不有用的列表函数。)

一般情况下,k>1且列表不为空:

  • 要删除k:th元素,请从列表尾部删除元素k-1,然后将原始列表的头部添加到结果中
基本情况:

  • 从列表中删除元素1会生成列表的尾部
  • 从空列表中删除任何内容都会生成空列表
列表短于k的情况将在到达空列表时终止

像这样:

fun delete_ith ([], k) = []
  | delete_ith (x::xs, 1) = xs
  | delete_ith (x::xs, k) = x :: delete_ith (xs, k - 1)

您不需要helper函数或
length
。列表和索引都是您需要的参数。(提示:倒计时而不是倒计时。)谢谢,我知道了如何获得我想要的输出。但是如果没有helper函数,我将如何进行呢。
fun delete_ith ([], k) = []
  | delete_ith (x::xs, 1) = xs
  | delete_ith (x::xs, k) = x :: delete_ith (xs, k - 1)