Создать функцию - Lisp (229963)
Формулировка задачи:
Помогите с созданием функции замены положительных элементов на минимальный.
(defun m1 (LST) (setq nlist()) (setq m (CAR LST)) (dolist (el LST m) (if (> m el) (setq m el))) (cond ((null LST) nil) ((> (car LST) 0) (cons m (m1 (cdr LST)))) ((cons (car LST) (m1 (cdr LST)))))) (m1 '(8 7 22 -10 4 -12 3 1)
Решение задачи: «Создать функцию»
textual
Листинг программы
(defun plusp>min-deep (w &optional (m (reduce #'min (flat w))) &aux (a (car w))) (when w (cons (if (listp a) (plusp>min-deep a m) (if (plusp a) m a)) (plusp>min-deep (cdr w) m)))) (defun flat (w) (mapcan #'(lambda (a) (if (atom a) `(,a) (flat a))) w)) > (plusp>min-deep '(1 (2 (3)) ((-1) 4) ((-5)))) (-5 (-5 (-5)) ((-1) -5) ((-5)))
Объяснение кода листинга программы
В коде представлено две функции: plusp>min-deep
и flat
.
plusp>min-deep
- функция принимает два аргумента:w
иm
. Аргументw
- это список, который нужно обработать. Аргументm
- это результат работы функцииreduce
с аргументом#'min
и аргументомflat w
. В общем случае,m
- это минимальное значение из спискаw
. В первой строке кода создается условие: еслиw
не равноnil
, то выполняется следующая последовательность действий:- Создается новый список, который является результатом работы функции
plusp>min-deep
для аргументаa
и аргументаm
. Еслиa
является списком, то рекурсивно вызывается функцияplusp>min-deep
для аргументаa
и аргументаm
. Еслиa
является числомplusp
, то возвращается значениеm
. Еслиa
является числомminusp
, то возвращается значениеa
. Еслиa
являетсяnil
, то возвращается значениеm
. - Если
a
не является списком, то возвращается новый список, который является результатом работы функцииplusp>min-deep
для аргументаcdr w
и аргументаm
. Вторая строка кода проверяет, является лиw
списком. Еслиw
не является списком, то возвращаетсяnil
.
- Создается новый список, который является результатом работы функции
flat
- функция принимает один аргументw
. Аргументw
- это список, который нужно обработать. В первой строке кода создается условие: еслиw
не равноnil
, то выполняется следующая последовательность действий:- Создается новый список, который является результатом работы функции
mapcan
с аргументом#'(lambda (a) (if (atom a)
(,a) (flat a))и аргументом
w. Функция
mapcanприменяет функцию, указанную в первом аргументе, к каждому элементу списка
w. Если элемент
aявляется атомом, то он преобразуется в строку в кавычках и добавляется в новый список. Если элемент
aявляется списком, то рекурсивно вызывается функция
flatдля аргумента
a. Вторая строка кода возвращает
nil, если
wне является списком. Пример вызова функции
plusp>min-deepс аргументом
'(1 (2 (3)) ((-1) 4) ((-5))возвращает новый список
-5 (-5 (-5)) ((-1) -5) ((-5). Это происходит потому, что функция
plusp>min-deepрекурсивно обрабатывает каждый элемент списка и возвращает новый список, в котором все числа
minuspзаменяются на минимальное значение из списка, а все числа
pluspзаменяются на
nil. Пример вызова функции
flatс аргументом
'(1 (2 (3)) ((-1) 4) ((-5))возвращает новый список
(1 2 3) (-1 4) (-5). Это происходит потому, что функция
flat` рекурсивно обрабатывает каждый элемент списка и возвращает новый список, в котором все элементы, которые являются атомами, преобразуются в строки в кавычках, а все элементы, которые являются списками, обрабатываются рекурсивно.
- Создается новый список, который является результатом работы функции
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д