Clojure中的正方形总和

时间:2013-02-08 15:50:05

标签: clojure lisp

我必须对Clojure语言做一个简短的介绍,在其中我还必须提供简单任务的解决方案:输入一个整数n并输出总和:1 + 2 ^ 2 + 3 ^ 2 + ... + N ^ 2。使用n的输入验证为正。

我之前没有使用Lisp方言或Java的xp,我发现这种挑战。我有多远? (猜测很多):

(defn sum_of_squares [n]
(if (> n 0)
    (def sum 0)
    (dotimes [n]
        (+ sum (* n n)))))

如你所见,我不知道发生了什么。我该如何实际提示用户输入 n 以及稍后 println 的总和?另外整个(+ sum(* n n)表达式应该存储在哪里,结果更新总和?

也许解决这个问题的方法很简单,所以请随时告诉我:)。

3 个答案:

答案 0 :(得分:1)

对于这些问题,这不是真正的地方,但这是一个Clojure问题而且我无法抗拒自己,让我试一试:

(defn sum-of-squares [n] (reduce (fn [memo x] (+ memo (* x x))) (range (inc n))))

此外,当您使用功能语言时,请考虑不变性。不要收集[1]。初始化后,除非使用线程安全,否则不要尝试更改它。 Clojure使用refs原子轻松实现这一点。一个非常相关的视频将是Rich Hickey的 - “Simple Made Easy”[1]关于同一主题的讨论。

答案 1 :(得分:0)

罗伯特·C·马丁又名“鲍勃叔叔”目前正在撰写关于函数式编程的一系列介绍性帖子,他正在使用的例子恰恰是你需要帮助的“平方和”例子(他在Clojure中这样做)。

如果您不熟悉函数式编程和Lisp / Clojure,您可能会对本系列文章感兴趣。 E2是他分享sum-of-squares

的实施的地方

答案 2 :(得分:0)

这是一个简单的功能解决方案:

(defn sum-of-squares [n] 
  (reduce + (map #(* % %) (range 1 (inc n)))))

从内到外阅读以了解其工作原理:

  • range从1移到n(使用(inc n)作为上限,因为您想要包含n本身)
  • map一个函数#(* % %),它只是一个对其参数求平方的匿名函数。这具有平方序列中所有数字的效果。
  • reduce带有+的序列 - 即将所有正方形加在一起以获得结果。