Создать функцию - 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.

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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5