4

文字列に変換して逆と比較しようとしているだけです

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

何かのようなもの

(is-palindrome 1221)

false を返す

4

5 に答える 5

10

代わりにこれを試してください:

(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))))
于 2012-02-05T04:20:03.593 に答える
6
(defn palindrome? [num]
  (= (seq (str num)) (clojure.string/reverse (str num))))
于 2012-02-05T09:55:48.890 に答える
3

コードは、文字列とシーケンスを比較しているため、false を返します。これは決して等しくありません。

次のように、文字列を明示的に seq に変換することで機能させることができます。

(defn is-palindrome? [num] 
  (let [digit-sequence (seq (str num))]
    (= digit-sequence (reverse digit-sequence))))
于 2012-02-05T07:14:14.953 に答える
1

文字のコレクションを操作するオーバーヘッドが支配的であることが判明したため、必要な 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)))
于 2012-02-21T20:18:16.050 に答える
0
(reverse (str 1221))

文字のリストを返します

(\1 \2 \2 \1)

しかし (str 1221) は Java 文字列です

于 2012-03-07T11:50:51.153 に答える