Удалить i-й элемент списка - PullRequest
0 голосов
/ 14 ноября 2018

Напишите функцию, которая удаляет 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;

примечание: строка x :: delete (xs, I, position + 1) должна быть сразу после остатка в предыдущей строке, когда перенос строки заставил меня показать код таким образом. Простите за это.

Но мой код выводит

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

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

Буду признателен за помощь, спасибо.

1 Ответ

0 голосов
/ 15 ноября 2018

Поскольку вы получили ожидаемые результаты, вот более короткая версия, которая проходит через список только один раз и никогда не выходит за пределы удаляемого элемента.
(length должен пройти весь список, чтобы определить его длину. Возможно, этонаименее полезная функция списка.)

Общий случай, k> 1 и список не пустой:

  • Чтобы удалить элемент k: th, удалите элемент k-1 изхвост списка, затем добавьте к исходному заголовку исходный список.

Базовые случаи:

  • Удаление элемента 1 из списка приводит к хвостуlist.
  • Удаление чего-либо из пустого списка приводит к созданию пустого списка.

Случай, когда список короче k, завершится, когда он достигнет пустого списка.

Вот так:

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