为什么下面的Clojure没有检测到回文?

时间:2012-02-05 04:10:11

标签: string clojure comparison palindrome

我只是想转换为字符串并与反向

进行比较
(defn is-palindrome? [num]
  (= (str num) (reverse (str num))))

这样的东西
(is-palindrome 1221)

返回false

5 个答案:

答案 0 :(得分:9)

请改为尝试:

(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))))

答案 1 :(得分:6)

(defn palindrome? [num]
  (= (seq (str num)) (clojure.string/reverse (str num))))

答案 2 :(得分:3)

您的代码返回false,因为它正在将字符串与序列进行比较,而序列永远不会相等。

您可以通过将字符串显式转换为seq来使其工作,如下所示:

(defn is-palindrome? [num] 
  (let [digit-sequence (seq (str num))]
    (= digit-sequence (reverse digit-sequence))))

答案 3 :(得分: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)))

答案 4 :(得分:0)

(reverse (str 1221))

返回字符列表

(\1 \2 \2 \1)

但是(str 1221)是一个java String