list - 使用整数列表复制列表元素的 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)))))
当然,这只是将单个元素复制一次。有人知道如何解决这个问题吗?
解决方案
使用mapcan
and
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)
请注意,递归版本更长并且可能更慢。
推荐阅读
- php - 将具有不同值的多个复选框插入相应的数据库列
- java - 使用 ConcurrentHashMap 同时 PUT/GET 的问题
- bash - 如何使用 SLURM 循环遍历脚本?(批量和运行)
- indexing - nomencl 乳胶不会显示输出
- html - 如何使用语义技术在块上划分标题:例如:标题包含:徽标图像,搜索......?
- php - php7.2.11 - pthreads-unable-to-initialize-module-in-windows-10
- python - Python Proton 将二进制数据发送到 Active MQ
- node.js - node.js 新手发现可能的 PATH 变量错误
- rocksdb - Rocksdb:使用唯一指针关闭数据库时断言“last_ref”失败
- r - 如何在统计测试中/之前以科学计数法显示数字?