С Новым годом! Форум программистов, компьютерный форум, киберфорум
Языки JVM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 10
1

Clojure Палиндром

22.05.2014, 01:30. Показов 1682. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Пожалуйста, помогите решить задачу на Common Lisp!

Дано натуральное число n.
Проверить, является ли число палиндромом (перевёртышем).
Например 2222, 6116. Вернуть T, если да, либо NIL, если нет

Я поняла, как решить данную задачу с помощью списка. Но вся проблема оказалась в том, что надо работать с числом, а не списком.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2014, 01:30
Ответы с готовыми решениями:

Clojure Найти наибольший палиндром
Добрый вечер. Нужно на лиспе написать программу нахождения наибольшего палиндрома сделанного из...

Проверить слово на палиндром и почти палиндром
Нужно проверить слово на палиндром и почти палиндром. например: КАЗАК - палиндром МЕЧОМ - почти...

Проверить слово на палиндром и почти палиндром
Нужно проверить слово на палиндром и почти палиндром. например: КАЗАК - палиндром МЕЧОМ - почти...

Палиндром, не палиндром. Функция
Написать функцию, возвращающую TRUE, если число является палиндромом. (35753 – палиндром, 123 –не...

8
1063 / 957 / 109
Регистрация: 04.11.2012
Сообщений: 999
22.05.2014, 08:36 2
Для начала превратите число в список.
Lisp
1
2
3
4
5
6
7
8
9
(defun Div-Num (num &optional acc &aux (r (rem num 10)))
  (if (< num 1)
      acc
      (Div-Num (/ (- num r) 10) (cons r acc))))
 
(Div-Num 2222)
; (2 2 2 2)
(Div-Num 6116)
; (6 1 1 6)
2
505 / 511 / 42
Регистрация: 12.12.2013
Сообщений: 484
22.05.2014, 08:41 3
Clojure:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defn task [n]
  (letfn [(result [n]
            (when (= n (reverse-number n)) true))
          (reverse-number [n]
            (loop [n n acc 0]
              (if (zero? n)
                acc
                (recur (quot n 10) (+ (* acc 10) (rem n 10))))))]
    (result n)))
;; => #'user/task
 
(task 6116)
;; => true
(task 6126)
;; => nil
3
4705 / 4400 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
22.05.2014, 09:30 4
как вариант:
Lisp
1
2
3
4
5
6
7
(defun palindrome-number (w)
  (equal (write-to-string w) (reverse (write-to-string w))))
 
> (palindrome-number 6116)
T
> (palindrome-number 6117)
NIL
Добавлено через 1 минуту
Lisp
1
2
3
4
5
6
7
(defun palindrome-number (w &aux (v (write-to-string w)))
  (equal v (reverse v)))
 
> (palindrome-number 6116)
T
> (palindrome-number 6117)
NIL
3
Модератор
Эксперт функциональных языков программированияЭксперт Python
37346 / 20778 / 4276
Регистрация: 12.02.2012
Сообщений: 34,187
Записей в блоге: 14
22.05.2014, 09:45 5
HomeLisp:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
(defun is-Pal (n)
  (let ((s (fix2str n))) (eq s (strRev s))))
 
==> is-Pal
 
(is-Pal 123)
 
==> NIL
 
(is-Pal 121)
 
==> T
Добавлено через 3 минуты
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(defun is-pal (n)
  (let ((r nil))
    (loop
      (when (zerop n) (return (equal r (reverse r))))
      (push (rem n 10) r)
      (setq n (\ n 10)))))
 
==> is-Pal
 
(is-Pal 121)
 
==> T
 
(is-Pal 123)
 
==> NIL
2
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 10
22.05.2014, 12:17  [ТС] 6
Lambdik, спасибо большое! Я как раз долго думала, как это сделать. Но списки все равно в итоге нельзя использовать.
_sg, ничего себе, как локанично! Спасибо!
Catstail, smoke853, спасибо большое! Так много теперь вариантов различных.

Интересно, а можно ли решить эту задачу с помощью рекурсии? Можно брать конец числа, переворачивать, снова брать конец и сравнивать?

Добавлено через 40 минут
Я попробовала сделать вот так, но не пойму, что делаю не то?

Lisp
1
2
3
4
5
6
(defun pal(a)
(cond ((< a 10) T)
  (T (= (rem a 10)(pal (rev (truncate (/a 10)))))))) 
 
(defun rev(b)
  (parse-integer (reverse (write-to-string b))))
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37346 / 20778 / 4276
Регистрация: 12.02.2012
Сообщений: 34,187
Записей в блоге: 14
22.05.2014, 12:20 7
Цитата Сообщение от Sashazima Посмотреть сообщение
Интересно, а можно ли
- можно:

HomeLisp:

Lisp
1
2
(defun is-pal (n &optional (i n) (o 0))
  (if (zerop n) (= i o) (is-pal (\ n 10) i (+ (* o 10) (% n 10)))))
Common Lisp:

Lisp
1
2
(defun is-pal (n &optional (i n) (o 0))
  (if (zerop n) (= i o) (is-pal (truncate (/ n 10)) i (+ (* o 10) (rem n 10)))))
1
4705 / 4400 / 380
Регистрация: 12.05.2012
Сообщений: 3,100
22.05.2014, 13:11 8
как вариант:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(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
2
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 10
23.05.2014, 10:27  [ТС] 9
Catstail, _sg, большое спасибо!
0
23.05.2014, 10:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2014, 10:27
Помогаю со студенческими работами здесь

Палиндром
Добрый вечер! Проверяю, является ли число палиндромом. Взял строку, реверснул её и сравниваю через...

Палиндром
Дано некоторое натуральное число А. Если это не палиндром, то изменить порядок его цифр на...

Палиндром
Здравствуйте. Помогите, пожалуйста, написать программу, которая проверяла бы число 12345678654321...

Палиндром
Программа находит палиндромы в файле, но не совсем правильно, а именно: проверяет на условие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru