如何在clojure中一起添加列表中的元素?

时间:2014-12-16 21:34:40

标签: list clojure

我正在尝试创建一个在列表中添加元素的函数,如下面的

编辑内森戴维斯"没有零的修正:

   (defn sumv [s1]
    (for [x1 s1 x2 s1
    :when (< x1 x2)]
     (+ x1 x2)))

3 个答案:

答案 0 :(得分:1)

如果要显式使用递归,请考虑使用lazy-seq

(defn add-pairs [[x & [y :as r]]]             
 (lazy-seq                                   
   (if y                                     
     (cons (+ x y) (add-pairs r))))) 

答案 1 :(得分:0)

问题不够明确,所以我猜你想要什么。

如果你想添加每两个元素,那么你应该这样做:

(map #(apply + %) (partition 2 1 s1))

答案 2 :(得分:0)

我无法从问题中准确地告诉您要计算的内容,因此我无法在没有进一步详情的情况下为您提供完整的答案。

但是,我可以告诉您,您在结果中获得nil的原因是因为for的正文返回了单人if的值。 (if a x)(if a x nil)相同。换句话说,如果nil为假,则两个表达式都将评估为a

如果您的意图是使用if语句来过滤x2 >= x1的情况(即仅包括x1 < x2的情况),那么您可以通过包含{{:when来完成此操作带有for绑定的1}}子句:

 (defn sumv [s1]
  (for [x1 s1 x2 s1
        :when (< x1 x2)]
    (+ x1 x2)))

已修改代码的更新

(for [x s1
      y s2]
  <some-expression>)

基本相同
(for [x s1]
  (for [y s2]
    <some-expression>))

也就是说,它就像使用嵌套循环一样 - 它运行在序列的笛卡尔积上。

有几种方法可以获得你想要的东西,但简单的map可能是最好的:

(map + s1 (rest s1))

如果你愿意,可以使用partition(la @ manzur的回答),尽管你必须使用apply