Проверка правильности римских чисел - Lisp

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

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

Всем привет! Решаю задачку. Никак не могу разобраться. Буду благодарен за помощь! Условие задачи: Для представления римских цифр используются символы: I - один, V - пять, X -десять, L - пятьдесят. С - сто, D - пятьсот, М - тысяча. Для изображения числа с помощью римских цифр используются общеизвестные правила; так, например, 482 -CDLXXXII. 1999 - МСМХСIХ. Напишите функцию (f R), которая проверяет, правильна ли запись некоторого числа римскими цифрами R (R - список символов); например, (f '(I I I С)) = nil.

Решение задачи: «Проверка правильности римских чисел»

textual
Листинг программы
;;последовательность
(defun F1 (L)
    (cond ((null L) T)
    ((and (eq (car L) 'I) (eq (cadr L) 'C)) nil)
    ((and (eq (car L) 'I) (eq (cadr L) 'D)) nil)
    ((and (eq (car L) 'I) (eq (cadr L) 'M)) nil)
    ((and (eq (car L) 'X) (eq (cadr L) 'D)) nil)
    ((and (eq (car L) 'X) (eq (cadr L) 'M)) nil)
    (t (F1 (cddr L)))
    )
)
 
;;повторяемость
(defun F2 (L)
    (cond ((null L) T)
    ((and (eq (car L) (cadr L)) (eq (car L) (caddr L)) (eq (car L) (cadddr L))) nil)
    (t (f2 (cdr L)))
    )
)
 
;;основная функция
(defun F (L)
   (let ((rl (explode  L)))
            (if (F1 rl) 
                (if (F2 rl) t nil) nil)))
 
;;основная функция, в которой аргумент-список
(defun F (L)
            (if (F1 L) 
                (if (F2 L) t nil) nil)
)
 
;;результат
(F 'XXXX)
 
==> NIL
(F 'XXX)
 
==> T
(F 'MMM)
 
==> T
(F 'IMMM)
 
==> NIL
(f 'MMMCMXCIX)
 
==> T
 
(f '(M M M C M X C I X))
 
==> T
(f '(M M M M C M X C I X))
 
==> NIL

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

В этом коде реализована функция F, которая проверяет правильность римского числа. Код содержит две вспомогательные функции: F1 и F2, которые проверяют различные варианты римских чисел. Функция F1 проверяет, является ли первый элемент списка римским числом, а если да, то проверяет второй элемент списка. Если второй элемент списка не является 'C', 'D' или 'M', то функция возвращает nil. Если первый элемент списка 'I', то функция вызывает себя рекурсивно для оставшейся части списка. Функция F2 проверяет, является ли первый элемент списка римским числом, а если да, то проверяет второй, третий и четвертый элементы списка. Если все они совпадают, то функция возвращает nil. Если первый элемент списка 'X', то функция вызывает себя рекурсивно для оставшейся части списка. Функция F создает список из строки, используя функцию explode, и затем вызывает функцию F1 для этого списка. Если F1 возвращает nil, то функция вызывает себя рекурсивно для оставшейся части списка. Если F1 возвращает не nil, то функция проверяет результат F2 и возвращает nil или t в зависимости от результата. Код проверяет несколько примеров, включая 'XXXX', 'XXX', 'MMM', 'IMMM', 'MMMCMXCIX' и '(M M M C M X C I X)'. Все эти примеры являются правильными римскими числами, поэтому код возвращает t. Если бы были использованы неправильные римские числа, например, '(M M M D C M X C I X)', код бы вернул nil.

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


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

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

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