-1

我正在尝试打印 2 个向量的总和而不使用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)

有人可以建议我哪里出错了吗?

4

1 回答 1

1

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

当你在做

(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)))

有一个快速的替代方案,它会调用flatten您的最终结果:

 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)
于 2013-10-24T17:30:22.430 回答