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

事实证明,操作字符集合的开销占主导地位,因此将原始字符串与反转版本进行比较实际上更快,即使看起来您要比较的字符数量是必要的两倍。确保使用 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)))
于 2012-02-21T20:18:16.050 回答
0
(reverse (str 1221))

返回一个字符列表

(\1 \2 \2 \1)

但是 (str 1221) 是一个 java 字符串

于 2012-03-07T11:50:51.153 回答