Recursion 在clojure中陷入向量求和而不使用map

Recursion 在clojure中陷入向量求和而不使用map,recursion,clojure,sum,Recursion,Clojure,Sum,我正在尝试打印两个向量的和,而不使用map。我的代码是 (defn sumv [a1 b1] (if (or (empty? a1) (empty? b1)) (list ) (list (+ (first a1) (first b1)) (sumv (rest a1) (rest b1)) ))) 当提供: (sumv [9 6 5 65 43 21 67] [0 0 0]) 我得到的结果是: (10 (8 (

我正在尝试打印两个向量的和,而不使用
map
。我的代码是

  (defn sumv [a1 b1]
    (if (or (empty? a1) (empty? b1))
     (list )   
       (list (+ (first a1) (first b1))
         (sumv (rest a1) (rest b1))
          )))
当提供:

(sumv [9 6 5 65 43 21 67] [0 0 0])
我得到的结果是:

(10 (8 (8 ())))
但我想:

(10 8 8)

有人能告诉我哪里出错了吗?

问题是递归在每次迭代中都嵌套了一个新列表

当你在做

(list (+ a b) (sumv (rest x) (rest y))
它将随着时间的推移而扩大

(list (+ a b) (list (+ c d) (sumv (rest z) (rest w)))
所以最后你得到的是这样的东西:

 user> (list 2 (list 3 (list 4)))
   => (2 (3 (4)))
有一种快速的替代方法,就是在最终结果上调用
flant

 user> (flatten (list 2 (list 3 (list 4))))
   => (2 3 4)
但是,您始终可以从一开始就更改递归以构建正确的列表

例如,在递归步骤中使用
cons

 (cons (+ a b) (sumv (rest x) (rest y))
在每个步骤中,您
cons
将一个元素添加到单个列表中,以便可视化递归:

 user> (cons 2 (cons 3 (cons 4 [])))
 (2 3 4)

你为什么给出否定的观点?