文字列に変換して逆と比較しようとしているだけです
(defn is-palindrome? [num]
(= (str num) (reverse (str num))))
何かのようなもの
(is-palindrome 1221)
false を返す
文字列に変換して逆と比較しようとしているだけです
(defn is-palindrome? [num]
(= (str num) (reverse (str num))))
何かのようなもの
(is-palindrome 1221)
false を返す
代わりにこれを試してください:
(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))))
(defn palindrome? [num]
(= (seq (str num)) (clojure.string/reverse (str num))))
コードは、文字列とシーケンスを比較しているため、false を返します。これは決して等しくありません。
次のように、文字列を明示的に seq に変換することで機能させることができます。
(defn is-palindrome? [num]
(let [digit-sequence (seq (str num))]
(= digit-sequence (reverse digit-sequence))))
文字のコレクションを操作するオーバーヘッドが支配的であることが判明したため、必要な 2 倍の文字を比較しているように見えても、元の文字列を逆バージョンと比較する方が実際には高速です。clojure.core/reverse ではなく、clojure.string/reverse を使用してください。通常の Clojure の規則では、述語を疑問符で終わらせますが、"is" プレフィックスは使用しません。
(require 'clojure.string)
(defn palindrome? [s] (= s (clojure.string/reverse s)))
(defn palindrome-num? [n] (palindrome? (str n)))
(reverse (str 1221))
文字のリストを返します
(\1 \2 \2 \1)
しかし (str 1221) は Java 文字列です