Lisp程序使用整数列表复制列表的元素

jos*_*ess 3 lisp syntax list common-lisp duplicates

我正在开发一个程序,它接受一个元素列表,并根据第二个整数列表中包含的整数复制每个单独的元素.例如,如果我有一个列表

(A B C D)
Run Code Online (Sandbox Code Playgroud)

被复制:

(1 5 4 2)
Run Code Online (Sandbox Code Playgroud)

我会

(A B B B B B C C C C D D)
Run Code Online (Sandbox Code Playgroud)

到目前为止我有

(defun COPY (X Y) 
  (if (zerop Y) 
      nil 
      (cons S (COPY X (1 - Y)))))
Run Code Online (Sandbox Code Playgroud)

当然,这只是单个元素重复一次.有人知道如何解决这个问题吗?

sds*_*sds 7

使用mapcanmake-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)
Run Code Online (Sandbox Code Playgroud)

要不就

(mapcan #'copy '(A B C D) '(1 5 4 2))
Run Code Online (Sandbox Code Playgroud)

如果您需要使用简单的递归,您也可以编写

(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)
Run Code Online (Sandbox Code Playgroud)

请注意,递归版本更长,可能更慢.