Напишите функцию, которая удаляет элемент яth списка. Если длина списка меньше я, вернуть список.
Это желаемый результат:
- 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) должна быть сразу после else в предыдущей строке, перенос строки заставил меня показать код таким образом. Простите за это.
Но мой код выводит
- 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
Буду признателен за помощь, спасибо.
Спасибо, я понял, как получить желаемый результат. Но как бы я это сделал без вспомогательной функции?
Поскольку у вас есть ожидаемые результаты, вот более короткая версия, которая проходит по списку только один раз и никогда не выходит за пределы удаляемого элемента.
(length
должен пройти весь список, чтобы определить его длину. Возможно, это наименее полезная функция списка.)
Общий случай, k> 1 и список не пустой:
Базовые случаи:
Случай, когда список короче k, завершится, когда он достигнет пустого списка.
Нравится:
fun delete_ith ([], k) = []
| delete_ith (x::xs, 1) = xs
| delete_ith (x::xs, k) = x :: delete_ith (xs, k - 1)
Вам не нужна вспомогательная функция или
length
. Список и индекс - это все необходимые параметры. (Подсказка: обратный отсчет, а не вверх.)