我只是想转换为字符串并与相反的比较
(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))))
事实证明,操作字符集合的开销占主导地位,因此将原始字符串与反转版本进行比较实际上更快,即使看起来您要比较的字符数量是必要的两倍。确保使用 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)))
(reverse (str 1221))
返回一个字符列表
(\1 \2 \2 \1)
但是 (str 1221) 是一个 java 字符串