Создать функцию - 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` рекурсивно обрабатывает каждый элемент списка и возвращает новый список, в котором все элементы, которые являются атомами, преобразуются в строки в кавычках, а все элементы, которые являются списками, обрабатываются рекурсивно.
- Создается новый список, который является результатом работы функции