我必须对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)表达式应该存储在哪里,结果更新总和?
也许解决这个问题的方法很简单,所以请随时告诉我:)。
答案 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
带有+
的序列 - 即将所有正方形加在一起以获得结果。