我正在研究一个包含元素列表的程序,并且每个单独的元素都是根据第二个整数列表中包含的整数进行复制的。例如,如果我有一个列表
(A B C D)
复制者:
(1 5 4 2)
我会
(A B B B B B C C C C D D)
到目前为止,我有
(defun COPY (X Y)
(if (zerop Y)
nil
(cons S (COPY X (1 - Y)))))
当然,这只是复制单个元素几次。有谁知道如何解决这个问题?
答案 0 :(得分:7)
使用mapcan
并
make-list
(这是您的copy
的库版本):
(mapcan (lambda (letter num)
(make-list num :initial-element letter))
'(A B C D) '(1 5 4 2))
==> (A B B B B B C C C C D D)
或者只是
(mapcan #'copy '(A B C D) '(1 5 4 2))
如果需要使用简单的递归,还可以编写
(defun copy-list-elements (elements counts)
(and elements counts
(let ((count (pop counts)))
(if (plusp count)
(cons (car elements)
(copy-list-elements elements
(cons (1- count) counts)))
(copy-list-elements (cdr elements)
counts)))))
(copy-list-elements '(A B C D E) '(1 5 4 0 2))
==> (A B B B B B C C C C E E)
请注意,递归版本较长且可能较慢。
答案 1 :(得分:3)
在两个列表上循环,调用copy
,然后附加结果。
(loop for letter in letters
for count in counts
nconcing (copy letter count))