Увеличение числового списка - Lisp

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

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

Функция которая увеличивает все элементы числового списка в два раза (список может быть многоуровневым). Получилось сделать только для простого списка.
(DEFUN DOUBLE ( OLDLIST ) 
    (LET ((NEWLIST NIL)) 
       (LOOP 
            (COND (( NULL OLDLIST ) (RETURN NEWLIST))) 
            (SETQ NEWLIST (APPEND NEWLIST (LIST (* 2 (CAR OLDLIST))))) 
            (SETQ OLDLIST (CDR OLDLIST )))))

Решение задачи: «Увеличение числового списка»

textual
Листинг программы
(defun deep-double (w &aux (a (car w)))
  (when w (cons (if (atom a) (* a 2) (deep-double a))
                (deep-double (cdr w)))))
 
> (deep-double '(1 2 3 (((4 5) 6) 7)))
(2 4 6 (((8 10) 12) 14))

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

В этом коде определен пользовательский функцию глубокого удвоения списка с именем deep-double. Функция принимает два аргумента: w — список, который нужно удвоить, и a — текущий элемент списка w. Внутри функции используется вспомогательная переменная a, которая инициализируется значением первого элемента списка w. Затем функция проверяет, является ли a атомом (то есть, является ли a числом или символом). Если это так, то функция удваивает значение a и возвращает его. Если a не является атомом, то функция вызывает саму себя (через deep-double a) для обработки вложенных списков. Затем функция использует оператор cons для добавления результата обработки текущего элемента к новому списку. Наконец, функция вызывает саму себя (через deep-double (cdr w)) для обработки следующего элемента списка w. В итоге, функция deep-double создает новый список, в котором каждый элемент удвоен. Пример использования функции: (deep-double '(1 2 3 (((4 5) 6) 7))) вернет новый список (2 4 6 (((8 10) 12) 14)).

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


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

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

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