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