Палиндром - Lisp
Формулировка задачи:
Здравствуйте! Пожалуйста, помогите решить задачу на Common Lisp!
Дано натуральное число n.
Проверить, является ли число палиндромом (перевёртышем).
Например 2222, 6116. Вернуть T, если да, либо NIL, если нет
Я поняла, как решить данную задачу с помощью списка. Но вся проблема оказалась в том, что надо работать с числом, а не списком.
Решение задачи: «Палиндром»
textual
Листинг программы
(defun palindrome-number (n) (cond ((< n 10)) ((eq (take-left n) (take-right n)) (palindrome-number (trim-left (trim-right n)))))) (defun take-right (n) (rem n 10)) (defun take-left (n) (if (< n 10) n (take-left (truncate n 10)))) (defun trim-left (n &optional (z n) (m 0)) (if (< n 10) (rem z (expt 10 m)) (trim-left (truncate n 10) z (1+ m)))) (defun trim-right (n) (truncate n 10)) > (palindrome-number 61516) T > (palindrome-number 61517) NIL
Объяснение кода листинга программы
В коде определена функция palindrome-number
, которая проверяет, является ли число палиндромом.
Алгоритм работы функции следующий:
- Если число меньше 10, то оно само является палиндромом и функция возвращает
T
. - Функция
take-left
иtake-right
принимают число и возвращают его левую и правую части, отрезанные от основания системы счисления (10). - Функция
trim-left
принимает число, начальное значение для обрезки слева и текущую степень десятки. Если число меньше 10, то оно не нуждается в обрезке слева. Обрезка слева заключается в умножении числа на 10 в степени, равной текущей степени десятки, и вычитании из него числа, образованного из начального значения обрезки слева, умноженного на 10 в степени, равной текущей степени десятки минус один. Если число больше или равно 10, то оно обрезается слева до ближайшего меньшего числа, кратного 10. - Функция
trim-right
принимает число и возвращает его, обрезанное до ближайшего меньшего числа, кратного 10. - Если число не палиндром, то его можно обрезать слева и справа до ближайших чисел, кратных 10, и передать в рекурсивный вызов
palindrome-number
. - Если число больше или равно 10, то оно не является палиндромом.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д