我只是想轉換爲字符串,並比較反向爲什麼下面的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