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)
当然,这只是单个元素重复一次.有人知道如何解决这个问题吗?
使用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)
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)
请注意,递归版本更长,可能更慢.
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |