我试图在不使用map
的情况下打印2个向量的总和。我的代码是
(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)
有人可以告诉我哪里出错了吗?
答案 0 :(得分: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)