首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >理解复现

理解复现
EN

Stack Overflow用户
提问于 2015-07-11 02:28:06
回答 2查看 88关注 0票数 1

尝试一下这段代码,似乎不太正确。

代码语言:javascript
运行
复制
(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

我猜这与:

代码语言:javascript
运行
复制
(recur (dec start) (or (multiple_of? 3 start) (multiple_of? 5 start)
                            (+ total start)
                            start)))))

但我不知道为什么,我对clojure还不太熟悉,所以我想重新了解一下。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-11 03:00:17

一旦开始时,or调用返回一个布尔值((multiple_of? 3 start))的倍数为3。

在Clojure中,or总是返回它的一个参数--如果存在,则返回第一个真参数,或者返回最后一个falsish参数。

票数 3
EN

Stack Overflow用户

发布于 2015-07-11 04:06:43

您确实希望为您的recur提供一个条件表达式,并且总是返回一个数字。例如:

代码语言:javascript
运行
复制
(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)))))

请注意,这是一种在函数式语言中实现此功能的奇怪方法。您实际上是从一个范围中选择值并将它们加起来,所以最好将其实现为一个过滤器和一个减缩,例如:

代码语言:javascript
运行
复制
(reduce + (filter #(or (multiple_of? 3 %) (multiple_of? 5 %)) (range 50)))
=> 543
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31352822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档