尝试一下这段代码,似乎不太正确。
(defn- multiple_of?
[div num]
(= (mod num div) 0))
(defn sum_of_multiples_from
([start] (sum_of_multiples_from start 0))
([start total]
(if (<= start 0)
total
(recur (dec start) (or (multiple_of? 3 start) (multiple_of? 5 start)
(+ total start) start)))))我收到以下错误:
不能将java.lang.Boolean转换为java.lang.Number
我猜这与:
(recur (dec start) (or (multiple_of? 3 start) (multiple_of? 5 start)
(+ total start)
start)))))但我不知道为什么,我对clojure还不太熟悉,所以我想重新了解一下。
发布于 2015-07-11 03:00:17
一旦开始时,or调用返回一个布尔值((multiple_of? 3 start))的倍数为3。
在Clojure中,or总是返回它的一个参数--如果存在,则返回第一个真参数,或者返回最后一个falsish参数。
发布于 2015-07-11 04:06:43
您确实希望为您的recur提供一个条件表达式,并且总是返回一个数字。例如:
(defn sum_of_multiples_from
([start] (sum_of_multiples_from start 0))
([start total]
(if (<= start 0)
total
(recur (dec start)
(if (or (multiple_of? 3 start) (multiple_of? 5 start))
(+ total start)
total)))))请注意,这是一种在函数式语言中实现此功能的奇怪方法。您实际上是从一个范围中选择值并将它们加起来,所以最好将其实现为一个过滤器和一个减缩,例如:
(reduce + (filter #(or (multiple_of? 3 %) (multiple_of? 5 %)) (range 50)))
=> 543https://stackoverflow.com/questions/31352822
复制相似问题