小编gum*_*muz的帖子

这是惯用的Clojure吗?

我已经开始使用Clojure进行Project Euler,这是学习Clojure的第一次尝试.我已经解决了第一个任务:

求出1000以下3或5的所有倍数的总和.

我以前用Python解决了它:

sum(i for i in xrange(1000) if i%3==0 or i%5==0)
Run Code Online (Sandbox Code Playgroud)

这是我的第一次Clojure尝试:

(reduce +
  (filter 
    (fn [x]
      (or 
        (= 0 (mod x 3)) 
        (= 0 (mod x 5))))
    (range 1000)))
Run Code Online (Sandbox Code Playgroud)

我真的很惊讶它有多详细,但我很确定这是因为我的风格和对Clojure成语的无知.

这个Clojure代码的惯用版本会是什么样的?

clojure

7
推荐指数
2
解决办法
260
查看次数

然后算法和公平地分摊账单:)

我正试图解决你可能遇到的以下现实问题:

你和一些朋友共进晚餐,你们都同意平均分摊账单.除了账单终于到来之外,你发现不是每个人都有足够的现金(如果有的话,便宜的混蛋).

所以,你们中的一些人比其他人付出更多......之后你们回家并试着决定"谁欠谁的数额?".

这个,我正在尝试以算法和公平的方式解决:)

一开始看起来这么容易,但是我已经陷入了四舍五入的困境,我觉得这完全是一个失败者;)

关于如何解决这个问题的任何想法?

编辑:一些python代码,以显示我的困惑

>>> amounts_paid = [100, 25, 30]
>>> total = sum(amounts_paid)
>>> correct_amount = total / float(len(amounts_paid))
>>> correct_amount
51.666666666666664
>>> diffs = [amnt-correct_amount for amnt in amounts_paid]
>>> diffs
[48.333333333333336, -26.666666666666664, -21.666666666666664]
>>> sum(diffs)
7.1054273576010019e-015
Run Code Online (Sandbox Code Playgroud)

理论上,差异的总和应为零,对吧?

另一个例子它工作:)

>>> amounts_paid = [100, 50, 150]
>>> total = sum(amounts_paid)
>>> correct_amount = total / float(len(amounts_paid))
>>> correct_amount
100.0
>>> diffs = [amnt-correct_amount for amnt in amounts_paid]
>>> diffs
[0.0, -50.0, 50.0]
>>> sum(diffs)
0.0
Run Code Online (Sandbox Code Playgroud)

python algorithm math floating-accuracy

3
推荐指数
2
解决办法
3817
查看次数

标签 统计

algorithm ×1

clojure ×1

floating-accuracy ×1

math ×1

python ×1