首页 > 解决方案 > 使用整数列表复制列表元素的 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)))))

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

标签: listsyntaxduplicateslispcommon-lisp

解决方案


使用mapcanand 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)

请注意,递归版本更长并且可能更慢。


推荐阅读