Clojure中的平方和

Clojure中的平方和,clojure,lisp,Clojure,Lisp,我必须对Clojure语言做一个简短的介绍,并在其中提供简单任务的解决方案:输入一个整数n,然后输出和:1+2^2+3^2+…+n^2。使用输入验证使n为正。 我以前没有使用过Lisp方言或Java的xp,我觉得这很有挑战性。我离这里有多远?(猜测很多): 正如你所看到的,我不知道发生了什么。我应该如何实际提示用户输入n的值,然后输入println的总和?另外,整个(+sum(*n)表达式应该在哪里存储其结果,并在过程中更新sum 也许有更简单的方法来解决这个问题,所以请随意向我展示:)。这不是

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

我以前没有使用过Lisp方言或Java的xp,我觉得这很有挑战性。我离这里有多远?(猜测很多):

正如你所看到的,我不知道发生了什么。我应该如何实际提示用户输入n的值,然后输入println的总和?另外,整个(+sum(*n)表达式应该在哪里存储其结果,并在过程中更新sum


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

这不是解决这些问题的好地方,但这是一个Clojure问题,我无法抗拒自己,让我试一试:

(defn sum-of-squares [n] (reduce (fn [memo x] (+ memo (* x x))) (range (inc n))))
另外,在处理函数式语言时,请考虑不变性。不完整[1]。一旦你初始化了一些东西,不要尝试去改变它,除非你考虑到了线程安全。Clojure通过引用原子使这变得容易。一个非常相关的视频将是里奇·希基关于同一主题的“简单变得容易”[1]演讲。

罗伯特·C·马丁·A.k.“鲍勃叔叔”目前正在写一系列关于函数式编程的介绍性文章,他使用的例子正是你需要帮助的“平方和”例子(他是在Clojure中做的)

如果您是函数式编程和Lisp/Clojure的新手,您可能会对本系列感兴趣。E2是他分享其实现的
平方和


    • 这里有一个简单的功能解决方案:

      (defn sum-of-squares [n] 
        (reduce + (map #(* % %) (range 1 (inc n)))))
      
      从内到外阅读,了解其工作原理:

      • 范围
        从1到n(使用
        (inc n)
        作为上限,因为您希望包括n本身)
      • map
        一个函数
        #(*%%)
        ,它只是一个匿名函数,用于对其参数进行平方运算。这具有将序列中的所有数字平方的效果
      • 使用
        +
        减少序列,即将所有方块相加以获得结果

      您应该为输入验证添加类似于
      {:pre[(>n0)]}
      的内容,但它不只是返回
      0
      ?(reduce+…)而不是(apply+…)。不是说apply不起作用,但它远不是理想的。本质上是一样的,但我觉得更干净一些:
      (defn平方和[n](reduce+(map#(*%)(range(incn);
      (defn ss[n]{:pre[(>n0)]}(/(*n(incn)(inc n2))
      ?看一下怎么样?:)谢谢,你的回答很有帮助,尽管我还不能投票!这篇关于函数式编程的介绍对我来说真的很清楚。它看起来非常有趣,将来我可能会重点关注这种编程风格,我们会看到:)是的,这是以前建议的,我实际上使用了+包括一个if条件,因为这是我任务的一部分。感谢您的回答,也感谢您准确地解释了它的工作原理:)
      
      (defn sum-of-squares [n] 
        (reduce + (map #(* % %) (range 1 (inc n)))))