Обратный порядок цифр в атоме. Рекурсия - 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)

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

  1. Функция symbols принимает строку a и возвращает список строк, полученных из символов строки a.
  2. Функция rev-ns принимает два аргумента: список w и значение v. Если w — это nil, то возвращает nil. Если первый элемент w является числом, то возвращает пару, где первый элемент — это v, а второй элемент — это результат рекурсивного вызова функции rev-ns для оставшейся части списка w и значения v. Если первый элемент w является парой, то возвращает результат рекурсивного вызова функции rev-ns для оставшейся части списка w и значения v.
  3. Функция reverse-numbers принимает строку a и вспомогательную переменную v. Вначале вызывается функция symbols для преобразования строки a в список строк. Затем вызывается функция concatenate для объединения всех элементов списка в одну строку. Затем вызывается функция mapcar для применения функции write-to-string к каждому элементу списка и объединения результатов в одну строку. Затем вызывается функция remove-if-not для удаления всех элементов, которые не являются числами. Затем вызывается функция rev-ns для рекурсивного обращения порядка чисел в полученном списке.
  4. Функция inner-reverse принимает список w и рекурсивно вызывает себя для обращения порядка элементов в списке w. Если элемент списка w является парой, то первый элемент пары передается в функцию reverse-numbers, а второй элемент пары передается в рекурсивный вызов функции inner-reverse.
  5. Вызывается функция inner-reverse с аргументом '(a1b2c a10b23). Результатом является (A2B1C A32B01).

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


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

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

10   голосов , оценка 3.5 из 5