Clojure 中前 200 个数字的总和?

M5R*_*KED 1 clojure

我正在尝试编写一段 Clojure 代码来计算前 200 个整数的总和。我试图作为输出得到的答案是 20100。这是我最接近的尝试。

(reduce + (range 200))
Run Code Online (Sandbox Code Playgroud)

上面的代码输出:19900。

有人可以解释我在这里出错的地方以及如何解决这个问题吗?

Jua*_*rez 7

来自range文档

返回从开始(包括)到结束(不包括)的 nums 的惰性序列

顺便说一句,除非您必须使用reduce,否则最好使用高斯公式:

(defn sum-first-n [n]
  (/ (* n (inc n)) 2))
Run Code Online (Sandbox Code Playgroud)

证明:

user=> (defn sum-first-n [n]
  #_=>   (/ (* n (inc n)) 2))
#'user/sum-first-n
user=> (sum-first-n 200)
20100
Run Code Online (Sandbox Code Playgroud)


pet*_*e23 7

其他用户为您的问题提供了 2 个很好的解决方案,但是我不确定他们是否回答“如何解决这个问题?”。

在传统语言中,我会启动调试器并检查我正在减少的集合。在 Clojure 中,这要容易得多。我在 REPL,所以我可以直接检查事情。

 ;; I always forget how range works after 10 years hacking clj
 (reduce + (range 200))
 ;; => 19900
 ;; that's not what I expect
 (last (range 200))
 ;; => 199
 ;; aha!
 (last (range 201))
 ;; => 200
 (reduce + (range 201))
 ;; => 20100
Run Code Online (Sandbox Code Playgroud)

这股力量不容小觑。对于比生成一系列数字更费力的事情,您可以将数据存储在 var 中以进行检查。

 (def x (unnecessary-webservice/range 200))
 ;; => #'user/x
 (reduce + x)
 ;; => 19900
 (last x)
 ;; => 199
 ;; etc
 
Run Code Online (Sandbox Code Playgroud)