Обратный порядок цифр в атоме. Рекурсия - Lisp
Формулировка задачи:
В общем, нужно сделать так, чтобы в каждом атоме списка цифры шли в обратном порядке, но буквы при этом оставались не тронуты. К примеру (a53r2 - a23r5).
Нужна помощь.
Решение задачи: «Обратный порядок цифр в атоме. Рекурсия»
textual
Листинг программы
(defun symbols (a) (mapcar #'read-from-string (map 'list #'string (string a)))) (defun rev-ns (w v) (cond ((null w) nil) ((numberp (car w)) (cons (car v) (rev-ns (cdr w) (cdr v)))) ((cons (car w) (rev-ns (cdr w) v))))) (defun reverse-numbers (a &aux (v (symbols a))) (read-from-string (apply #'concatenate 'string (mapcar #'write-to-string (rev-ns v (reverse (remove-if-not #'numberp v))))))) (defun inner-reverse (w) (when w (cons (reverse-numbers (car w)) (inner-reverse (cdr w))))) > (inner-reverse '(a1b2c a10b23)) (A2B1C A32B01)
Объяснение кода листинга программы
- Функция
symbols
принимает строкуa
и возвращает список строк, полученных из символов строкиa
. - Функция
rev-ns
принимает два аргумента: списокw
и значениеv
. Еслиw
— этоnil
, то возвращаетnil
. Если первый элементw
является числом, то возвращает пару, где первый элемент — этоv
, а второй элемент — это результат рекурсивного вызова функцииrev-ns
для оставшейся части спискаw
и значенияv
. Если первый элементw
является парой, то возвращает результат рекурсивного вызова функцииrev-ns
для оставшейся части спискаw
и значенияv
. - Функция
reverse-numbers
принимает строкуa
и вспомогательную переменнуюv
. Вначале вызывается функцияsymbols
для преобразования строкиa
в список строк. Затем вызывается функцияconcatenate
для объединения всех элементов списка в одну строку. Затем вызывается функцияmapcar
для применения функцииwrite-to-string
к каждому элементу списка и объединения результатов в одну строку. Затем вызывается функцияremove-if-not
для удаления всех элементов, которые не являются числами. Затем вызывается функцияrev-ns
для рекурсивного обращения порядка чисел в полученном списке. - Функция
inner-reverse
принимает списокw
и рекурсивно вызывает себя для обращения порядка элементов в спискеw
. Если элемент спискаw
является парой, то первый элемент пары передается в функциюreverse-numbers
, а второй элемент пары передается в рекурсивный вызов функцииinner-reverse
. - Вызывается функция
inner-reverse
с аргументом'(a1b2c a10b23)
. Результатом является(A2B1C A32B01)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д