私は次のようにリスト内の項目を複製機能double()
を書いた:duplicate()関数のcons関数の呼び出し回数を制限することはできますか?
(defun duplicate (l)
(if (null l) nil
(cons (car l) (cons (car l) (duplicate (cdr l))))))
duplicate()
関数は、リスト内の各項目についてCONS
機能には、2つの呼び出しを行う:
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
関数の呼び出し回数をリスト項目ごとに1つに制限できますか?
最終的には、いや、 'cons'は、リストに項目を1つだけ追加されますので、各ステップで2つのアイテムを追加しています。 – chepner
そして、これを解決するために 'cons'関数とLispマッピング関数を組み合わせることはできませんか? – lukas
私はあなたの実装が2つのリストを連結するための最適化を持っているかどうかにかかっていると思います。概念的には(私は思うが)、新しいリストを作成するものは、任意の長いリストの先頭に一度に1つの要素を追加することによってそうする。 – chepner