Kot*_*pou 1 lisp nested common-lisp
假设我有一个清单:
((1 2 3) (8 4 7) (41 79 30) (0 8 5))
我想做这个:
(1+8+41+0 2+4+79+8 3+7+30+5) = (50 93 45)
我找到了一个丑陋的解决方案:
(defun nested+ (lst)
  (let ((acc nil))
    (dotimes (i (length (first lst)))
      (push (apply #'+ (mapcar #'(lambda (a) (nth i a)) lst)) acc))
    (reverse acc)))
它似乎适用于我的目的,但我想这是缓慢而且没有lispy.什么是正确的方法?
一种选择是(apply #'mapcar #'+ list).Mapcar会消耗尽可能多的列表,并在到达最短列表末尾时停止.
天真的解决方案是
(apply #'mapcar #'+ list)
然而,正如已经指出如这里由计算器和这里由LispWorks的call-arguments-limit(在最坏的情况下)50点的参数适用于由调用的函数apply.并reduce建议来代替.
因此,我建议:
(defun sum-all (lists)
  (reduce #'(lambda (l1 l2) (mapcar #'+ l1 l2)) lists))
确实如此
(sum-all '((1 2 3) (8 4 7) (41 79 30) (0 8 5)))
;; (50 93 45)
| 归档时间: | 
 | 
| 查看次数: | 312 次 | 
| 最近记录: |