我必须对 Clojure 语言做一个简短的演示,其中我还必须提供简单任务的解决方案:输入一个整数 n 并输出总和:1+2^2+3^2 +...+n^2。使用输入验证使 n 为正数。
我以前的 Lisp 方言或 Java 经验为零,我发现这很有挑战性。我离这还有多远? (猜测很多):
(defn sum_of_squares [n]
(if (> n 0)
(def sum 0)
(dotimes [n]
(+ sum (* n n)))))
正如你所见,我不知道发生了什么。我实际上应该如何提示用户输入 n 的值,然后输入 println 总和?另外,整个 (+ sum (* n n) 表达式应该在哪里存储其结果,并在此过程中更新 sum?
也许有很多更简单的方法来解决这个问题,所以请随意告诉我:)。
最佳答案
这是一个简单的功能解决方案:
(defn sum-of-squares [n]
(reduce + (map #(* % %) (range 1 (inc n)))))
从内到外阅读,看看它是如何工作的:
- 取从 1 到 n 的
范围
(使用(inc n)
作为上限,因为您想包含 n 本身) map
一个函数#(* % %)
,它只是一个对其参数进行平方的匿名函数。这具有对序列中所有数字进行平方的效果。减少
使用+
的序列 - 即将所有方 block 加在一起以获得结果。
关于clojure - Clojure 中的平方和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14776319/