2

我必须对 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的值,然后再打印总和?另外,整个(+ sum (* nn)表达式应该存储它的结果,在这个过程中更新 sum?

也许有很多更简单的方法可以解决这个问题,所以请随时向我展示:)。

4

2 回答 2

1

好吧,这不是真正适合这些问题的地方,但这是一个 Clojure 问题,我无法抗拒自己,让我试一试:

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

此外,当您处理函数式语言时,请考虑不变性。不要完成[1]。初始化某些内容后,除非考虑到线程安全,否则不要尝试更改它。Clojure 使用 refs、atoms 让这一切变得简单。一个非常相关的视频是 Rich Hickey 的 - “Simple Made Easy”[1] 关于同一主题的演讲。

于 2013-02-08T15:58:39.937 回答
1

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

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

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

  • range从 1 到 n ((inc n)用作上限,因为您想包含 n 本身)
  • map一个函数#(* % %),它只是一个与其参数平方的匿名函数。这具有将序列中的所有数字平方的效果。
  • reduce序列与+- 即将所有的正方形加在一起得到你的结果。
于 2013-02-09T11:52:14.813 回答