Удалить элементы первого списка по номерам второго списка без использования вспомогательных функций - Lisp
Формулировка задачи:
Может кто знает классический вид функции удаление элементов списка по номерам второго списка.Важно то,что нельзя использовать вспомогательные функции и циклы.
Решение задачи: «Удалить элементы первого списка по номерам второго списка без использования вспомогательных функций»
textual
Листинг программы
(defun drop (v w &optional (n 0) &aux (q (cdr w)) (m (1+ n))) (cond ((some 'null (list v w)) w) ((find n v) (drop (remove n v) q m)) ((cons (car w) (drop v q m)))))
Объяснение кода листинга программы
В данном коде определён функцией drop
с тремя аргументами v
, w
и n
. Если n
не равно 0, то оно перенаправляется в w
. Далее в w
удаляются элементы с указанными номерами, и результат выводится на экран. Если n
равно 0, то выводится список v
.
Вот список номеров, названий и значений переменных в порядке их использования в коде:
v
— список, элементы которого будут удаленыw
— список, из которого будут удалены элементыn
— номер элемента, который будет удаленq
— хвост спискаw
m
— номер следующего элемента для удаления Список номеров 1-5 относится к первому использованию функцииdrop
. В этом случае, еслиn
не равно 0, то выполняется следующая последовательность действий:w
присваивается значениеcdr w
, то есть хвост спискаw
- В
w
удаляются элементы с номерами, указанными вn
- Результат присваивается
q
m
присваивается значение1+ n
, то есть номер следующего элемента для удаления Список номеров 6-9 относится ко второму использованию функцииdrop
внутри условного оператораcond
. В этом случае, еслиn
не равно 0, то выполняется следующая последовательность действий:w
присваивается значениеremove n v
, то есть списокv
без элементов с номерами, указанными вn
- В
w
удаляются элементы с номерами, указанными вn
- Результат присваивается
q
m
присваивается значение1+ n
, то есть номер следующего элемента для удаления Список номеров 10-14 относится к третьему использованию функцииdrop
внутри условного оператораcond
. В этом случае, еслиn
не равно 0, то выполняется следующая последовательность действий:w
присваивается значениеcons (car w) (drop v q m)
, то есть списокw
с первым элементом, удаленным элементом и оставшимися элементами- В
w
удаляются элементы с номерами, указанными вn
- Результат присваивается
q
m
присваивается значение1+ n
, то есть номер следующего элемента для удаления Еслиn
равно 0, то выполняется следующая последовательность действий:w
присваивается значениеv
, то есть списокv
- Результат выводится на экран
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д