我寫了複製在列表中的項目如下功能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