Вычесть элемент списка из остальных его элементов - Lisp

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

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

Эта функция получает минимальный элемент. а потом этот элемент нужно вычесть из остальных элементов списка. Это можно сделать в этой же функции и как это сделать?
 (DEFUN MINLIST(X)
 (COND
  ((NULL (CDR X)) (CAR X))
  (T (MIN (CAR X)  (MINLIST (CDR X))))
)
)
Интуитивно кажется, что вычитание должно делаться так:
(-(Minlist X) X)

Решение задачи: «Вычесть элемент списка из остальных его элементов»

textual
Листинг программы
(defun abstract-min (w &optional (m (reduce #'min w)))
  (when w (cons (- (car w) m) (abstract-min (cdr w) m))))
 
> (abstract-min '(1 2 3 4 5))
(0 1 2 3 4)

Объяснение кода листинга программы

В коде определён функционал для получения абстрактного минимального элемента из списка.

  1. (defun abstract-min (w &optional (m (reduce #'min w)))). — Создаётся функция с именем abstract-min. — В функции используется опциональный параметр m, который инициализируется значением, полученным с помощью функции reduce и замыкания #'min. — Если список w не пустой, то из первого элемента списка вычитается значение m, и новая комбинация добавляется в начало списка. — Далее вызывается рекурсивно функция abstract-min, но уже без значения m, для обработки оставшейся части списка.
  2. (when w). — Проверяется условие, что список w не пустой.
  3. (cons (- (car w) m) (abstract-min (cdr w) m)). — Создаётся новая комбинация из вычитания первого элемента списка w и значения m. — Новая комбинация добавляется в начало списка. — Рекурсивный вызов функции abstract-min для обработки оставшейся части списка w.
  4. (abstract-min '(1 2 3 4 5)). — Функция abstract-min вызывается с первым аргументом, являющимся списком '(1 2 3 4 5). — В результате обработки списка функция возвращает новый список (0 1 2 3 4).

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


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

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

6   голосов , оценка 4.167 из 5
Похожие ответы