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)