为什么以下Clojure代码无法检测回文?

4

我只是想将其转换为字符串并与其反向进行比较

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

类似于以下内容:

(is-palindrome 1221)

返回false

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

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

1
对于一个序列,反转的时间复杂度是线性的。最好使用clojure.string/reverse来反转字符串。如果已经有了一个向量,使用rseq函数对一个向量进行反转的时间复杂度是常数级的。 - miner49r

3

您的代码返回false,因为它正在比较一个字符串和一个序列,这两者永远不可能相等。

您可以通过将字符串显式转换为序列来使其正常工作,方法如下:

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

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

0
(reverse (str 1221))

返回一个字符列表

(\1 \2 \2 \1)

但是(str 1221)是Java字符串


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接