【发布时间】:2011-02-22 20:49:03
【问题描述】:
大家,我昨天开始在 Clojure 的 Euler 项目上工作,但我的一个解决方案有问题,我无法弄清楚。
我有这个功能:
(defn find-max-palindrom-in-range [beg end]
(reduce max
(loop [n beg result []]
(if (>= n end)
result
(recur (inc n)
(concat result
(filter #(is-palindrom? %)
(map #(* n %) (range beg end)))))))))
我尝试这样运行它:
(find-max-palindrom-in-range 100 1000)
我得到了这个例外:
java.lang.Integer cannot be cast to clojure.lang.IFn
[Thrown class java.lang.ClassCastException]
我认为这意味着在某个地方我正在尝试将 Integer 作为函数进行评估。但是我找不到这个地方,更让我困惑的是,如果我像这样简单地评估它,一切正常:
(reduce max
(loop [n 100 result []]
(if (>= n 1000)
result
(recur (inc n)
(concat result
(filter #(is-palindrom? %)
(map #(* n %) (range 100 1000))))))))
(我刚刚剥离了函数定义并用常量替换了参数)
提前感谢您的帮助,很抱歉我可能会因为我的愚蠢错误而打扰您。顺便说一句,我正在使用 Clojure 1.1 和 ELPA 的最新 SLIME。
编辑:这是is-palindrom?的代码。我已经将它实现为数字的文本属性,而不是数字。
(defn is-palindrom? [n]
(loop [num (String/valueOf n)]
(cond (not (= (first num) (last num))) false
(<= (.length num) 1) true
:else (recur (.substring num 1 (dec (.length num)))))))
【问题讨论】:
-
我认为问题在于
is-palindrom?函数,因为当我实现缺少的is-palindrom?时,您的find-max-palindrom-in-range对我有用 -
我添加了我的 is-palindrom 代码?问题。
-
在 Clojure 中
is-palindom?的更好名称是:palindrome?。 -
(filter #(is-palindrome? %) ...)等价于(filter is-palindrome? ...)。
标签: clojure