Палиндром - 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, которая проверяет, является ли число палиндромом. Алгоритм работы функции следующий:

  1. Если число меньше 10, то оно само является палиндромом и функция возвращает T.
  2. Функция take-left и take-right принимают число и возвращают его левую и правую части, отрезанные от основания системы счисления (10).
  3. Функция trim-left принимает число, начальное значение для обрезки слева и текущую степень десятки. Если число меньше 10, то оно не нуждается в обрезке слева. Обрезка слева заключается в умножении числа на 10 в степени, равной текущей степени десятки, и вычитании из него числа, образованного из начального значения обрезки слева, умноженного на 10 в степени, равной текущей степени десятки минус один. Если число больше или равно 10, то оно обрезается слева до ближайшего меньшего числа, кратного 10.
  4. Функция trim-right принимает число и возвращает его, обрезанное до ближайшего меньшего числа, кратного 10.
  5. Если число не палиндром, то его можно обрезать слева и справа до ближайших чисел, кратных 10, и передать в рекурсивный вызов palindrome-number.
  6. Если число больше или равно 10, то оно не является палиндромом.

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


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

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

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