【问题标题】:Why does the following Clojure not detect a palindrome?为什么以下 Clojure 没有检测到回文?
【发布时间】:2012-02-05 04:10:10
【问题描述】:

我只是想转换为字符串并与相反的比较

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

类似

(is-palindrome 1221)

返回假

【问题讨论】:

    标签: string clojure comparison palindrome


    【解决方案1】:

    试试这个:

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

    【讨论】:

      【解决方案2】:
      (defn palindrome? [num]
        (= (seq (str num)) (clojure.string/reverse (str num))))
      

      【讨论】:

      • reverse 是 seq 的线性时间。最好使用 clojure.string/reverse 来反转字符串。如果您已经有一个向量,则 rseq 是一个向量的常数时间。
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        事实证明,操作字符集合的开销占主导地位,因此将原始字符串与反转版本进行比较实际上更快,即使看起来您要比较的字符数量是必要的两倍。确保使用 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)))
        

        【讨论】:

          【解决方案5】:
          (reverse (str 1221))
          

          返回一个字符列表

          (\1 \2 \2 \1)
          

          但是 (str 1221) 是一个 java 字符串

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-05-26
            • 1970-01-01
            • 2017-04-11
            • 2019-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-04
            相关资源
            最近更新 更多