Почему следующий Clojure не обнаруживает палиндром? - PullRequest
3 голосов
/ 05 февраля 2012

Я просто пытаюсь преобразовать в строку и сравнить с обратным

(defn is-palindrome? [num]
  (= (str num) (reverse (str num))))

Что-то вроде

(is-palindrome 1221)

Возвращает false

Ответы [ 5 ]

9 голосов
/ 05 февраля 2012

Попробуйте вместо этого:

(defn is-palindrome? [num]
  (= (str num) (apply str (reverse (str num)))))

В вашем коде выражение (reverse (str 1221)) возвращает список символов (\1 \2 \2 \1), который необходимо превратить в строку для сравнения. Кроме того, вы можете преобразовать оба числа в списки символов и вместо этого выполнить сравнение списка:

(defn is-palindrome? [num]
  (= (seq (str num)) (reverse (str num))))
6 голосов
/ 05 февраля 2012
(defn palindrome? [num]
  (= (seq (str num)) (clojure.string/reverse (str num))))
3 голосов
/ 05 февраля 2012

Ваш код возвращает false, потому что он сравнивает строку с последовательностью, которая никогда не может быть равной.

Вы можете заставить его работать, явно преобразовав строку в последовательность следующим образом:

(defn is-palindrome? [num] 
  (let [digit-sequence (seq (str num))]
    (= digit-sequence (reverse digit-sequence))))
1 голос
/ 22 февраля 2012

Оказывается, что преобладают накладные расходы на манипулирование коллекциями символов, поэтому на самом деле быстрее сравнивать исходную строку с обращенной версией, даже если кажется, что вы сравниваете вдвое больше символов, чем необходимо. Убедитесь, что вы используете clojure.string / reverse, а не clojure.core / reverse. Обычное соглашение Clojure - заканчивать предикат знаком вопроса, но не использовать префикс «is».

(require 'clojure.string)

(defn palindrome? [s] (= s (clojure.string/reverse s)))
(defn palindrome-num? [n] (palindrome? (str n)))
0 голосов
/ 07 марта 2012
(reverse (str 1221))

возвращает список символов

(\1 \2 \2 \1)

но (стр. 1221) является строкой Java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...