List Lisp程序,使用整数列表复制列表中的一个元素
我正在开发一个程序,它包含一个元素列表,每个元素都基于第二个整数列表中包含的整数进行复制。例如,如果我有一个List Lisp程序,使用整数列表复制列表中的一个元素,list,syntax,duplicates,lisp,common-lisp,List,Syntax,Duplicates,Lisp,Common Lisp,我正在开发一个程序,它包含一个元素列表,每个元素都基于第二个整数列表中包含的整数进行复制。例如,如果我有一个 (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))))) 当然,这只是将单个元素重复一次。有人知道怎么做吗?在两个列表上循环,调用copy,并附加结果
(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)))))
当然,这只是将单个元素重复一次。有人知道怎么做吗?在两个列表上循环,调用
copy
,并附加结果
(loop for letter in letters
for count in counts
nconcing (copy letter count))
使用及
(这是您的副本的库版本
):
或者只是
(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
不是函数,因此(1…
是一个错误。您想对参数1
和Y
调用函数-
,就像这样:(-1y)
1-
是一个function@RainerJoswig我在OP的问题中看到一个空格,可能是打字错误,但编写的代码有一个问题。@coredump:毫无疑问,这里有一个空格,但可能是打字错误或类似的错误。有时新来者可能不理解这一点,并写一个额外的空格。那里有一个打字错误,它是(cons X
,然后(COPY X(1-Y)…
:)
(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)