我只是想转换为字符串,并比较反向为什么下面的Clojure没有检测到回文?
(defn is-palindrome? [num]
(= (str num) (reverse (str num))))
喜欢的东西
(is-palindrome 1221)
是返回false
我只是想转换为字符串,并比较反向为什么下面的Clojure没有检测到回文?
(defn is-palindrome? [num]
(= (str num) (reverse (str num))))
喜欢的东西
(is-palindrome 1221)
是返回false
(defn palindrome? [num]
(= (seq (str num)) (clojure.string/reverse (str num))))
试试这个:
(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))))
您的代码返回false。
你可以把它用字符串明确地转换成序列的工作方式如下:
(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字符串
反向为SEQ线性时间。最好使用clojure.string/reverse来反转字符串。如果你已经有一个向量,rseq是一个向量的常量时间。 – miner49r 2012-02-21 19:54:52