我写了复制在列表中的项目如下功能double()
:是否可以限制在duplicate()函数中调用cons函数的次数?
(defun duplicate (l)
(if (null l) nil
(cons (car l) (cons (car l) (duplicate (cdr l))))))
的duplicate()
功能做出两次调用CONS
功能为每个项目在列表中:
Break 1 [2]> (trace cons)
;; Traçage de la fonction CONS.
(CONS)
Break 1 [2]> (duplicate '(1 2 3))
1. Trace: (CONS '3 'NIL)
1. Trace: CONS ==> (3)
1. Trace: (CONS '3 '(3))
1. Trace: CONS ==> (3 3)
1. Trace: (CONS '2 '(3 3))
1. Trace: CONS ==> (2 3 3)
1. Trace: (CONS '2 '(2 3 3))
1. Trace: CONS ==> (2 2 3 3)
1. Trace: (CONS '1 '(2 2 3 3))
1. Trace: CONS ==> (1 2 2 3 3)
1. Trace: (CONS '1 '(1 2 2 3 3))
1. Trace: CONS ==> (1 1 2 2 3 3)
(1 1 2 2 3 3)
是它可能将每个列表项目的呼叫次数限制为CONS
?
归根结底,没有,因为'cons'只增加一个项目名单,并且在每一步添加两个项目。 – chepner
我们不能将'cons'函数与lisp映射函数结合起来解决这个问题吗? – lukas
我认为这取决于你的实现是否有任何优化连接两个列表。在概念上(我认为),任何构建新列表的任何事都可以通过将一个元素一次添加到任意长列表的前面来完成。 – chepner