Создать функцию - Lisp (229963)

Узнай цену своей работы

Формулировка задачи:

Помогите с созданием функции замены положительных элементов на минимальный.
Листинг программы
  1. (defun m1 (LST)
  2. (setq nlist())
  3. (setq m (CAR LST))
  4. (dolist (el LST m)
  5. (if (> m el)
  6. (setq m el)))
  7. (cond ((null LST) nil)
  8. ((> (car LST) 0) (cons m (m1 (cdr LST))))
  9. ((cons (car LST) (m1 (cdr LST))))))
  10. (m1 '(8 7 22 -10 4 -12 3 1)

Решение задачи: «Создать функцию»

textual
Листинг программы
  1. (defun plusp>min-deep (w
  2.                   &optional (m (reduce #'min (flat w)))
  3.                   &aux (a (car w)))
  4.   (when w (cons (if (listp a)
  5.                     (plusp>min-deep a m)
  6.                     (if (plusp a) m a))
  7.                 (plusp>min-deep (cdr w) m))))
  8.  
  9. (defun flat (w)
  10.   (mapcan #'(lambda (a) (if (atom a) `(,a) (flat a))) w))
  11.  
  12. > (plusp>min-deep '(1 (2 (3)) ((-1) 4) ((-5))))
  13. (-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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут