我正在尝试创建一个在列表中添加元素的函数,如下面的
编辑内森戴维斯"没有零的修正:
(defn sumv [s1]
(for [x1 s1 x2 s1
:when (< x1 x2)]
(+ x1 x2)))
答案 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
。