Vector Clojure如何在向量中添加连续对?

Vector Clojure如何在向量中添加连续对?,vector,clojure,sum,Vector,Clojure,Sum,尝试编写在向量中添加连续对的递归函数 [1 2 3 4] => [3 5 7] 这就是我目前的情况: (def tmp [ 1 2 3 4]) user> (map #(+ (second %) (first %)) (partition-all 2 tmp )) 这是错误的,因为它只添加了对,而不是连续的对。我得到的是[3 7]而不是[3 5 7]分区需要一个额外的参数,指定每个分区之间的前进距离 (map#(apply+%)(分区21[12345])=> (3 5 7 9

尝试编写在向量中添加连续对的递归函数

[1 2 3 4] => [3 5 7]
这就是我目前的情况:

(def tmp  [ 1 2 3 4])

user> (map #(+ (second %) (first %)) (partition-all 2 tmp ))

这是错误的,因为它只添加了对,而不是连续的对。我得到的是
[3 7]
而不是
[3 5 7]

分区需要一个额外的参数,指定每个分区之间的前进距离

(map#(apply+%)(分区21[12345])
=>


(3 5 7 9)

以下是另一种可能的解决方案:

(def tmp [1 2 3 4])

(map + tmp (rest tmp))

您需要一个递归函数,尽管在大多数情况下,集合和列表函数比手工创建自己的递归函数更可取,但这并不总是可能的。使用累加器以惯用的函数方式递归编写此问题也非常容易

这个想法是从一个空的累加器开始,一步一步地构建结果。累加器(acc,在此代码段中)将保存最后的答案

(defn add-pairs [v1]
  (loop [the-list v1  acc []]
    (if   (next the-list) ;; checks wether there's more than 1 left in the-list
      (recur (rest the-list ) 
             (conj  acc (+ (first the-list) (second the-list))))
     acc)))
这里发生了什么?您将向量
[1234]
传递给
v1
。 然后循环开始,在循环中初始化两个变量:

the-list <- [1 2 3 4]
acc []
下一步:

the-list <- [3 4]
acc [3 5]

the-list <- [4]
acc [3 5 7]

如果我想使用递归,我该怎么做呢?非常感谢你一步一步的解释。将更多地围绕wi/这一点。非常好地介绍Clojure中的递归。顺便说一句,使用
count
检查某物是否为空是个坏主意。它与惰性集合的大小成线性关系,即使是之前已计数过的集合(计数未缓存)。只需检查
(空的?(下一个列表))
,便宜得多。@noismith,没错,我怀疑是否会使用它,但我没有,因为这似乎只是更需要解释的一步(因为nil pinning和truthiness与更惯用的检查方法一起发挥作用)。然而,在示例中不正确使用te是一个坏主意。所以我会改变它。甚至(不是(下一个列表))?这对于stackoverflow答案来说是一个不错的解决方案,但我永远不会用渴望循环/重现结构来编写这个函数。在现实生活中,我只会使用分区/映射,但如果我想用手工递归的方式来实现,那么懒惰的seq方法更好,也同样简单。根据我的经验,您最好编写自己的方法(如果我们包含
recurr
s,则始终是递归的)标准库函数的版本,而不是为标准函数在一行中解决的问题编写从头算解决方案。这里为您提供了两个这样的解决方案。
the-list <- [3 4]
acc [3 5]

the-list <- [4]
acc [3 5 7]
function add-pairs(v1 acc) {
   if (cond)
      //do stuff to v1 and acc
      add-pairs(v1 acc)
   else 
      return acc }

function add-pairs(v1) {
   return add-pairs(v1,[])
}

var result = add-pairs([42 666 1447])