あなたのソリューションで使用できる可能性は低いmapcon
ので、次のコードが宿題の答えを与えているとは思えません。ただし、何mapcon
が機能するかを読み、それを実装する方法を理解すれば、以下を解決策のガイドとして使用できます。
(defun pairs (list)
(mapcon (lambda (tail)
(mapcar (lambda (y)
(list (first tail) y))
(rest tail)))
list))
CL-USER> (pairs '(1 2 3 4))
;=> ((1 2) (1 3) (1 4) (2 3) (2 4) (3 4))
ここでの考え方は、元のリストの末尾を再帰したい場合です。つまり(1 2 3 4)
、それからいくつかのペアを検討(2 3 4)
して生成し、次にそれからいくつかのペアを検討して生成し、次に(3 4)
、次にそれからいくつかのペア(4)
(の空のセット) を生成します。
(1 2 3 4) → [1, (2 3 4)] ↦ ((1 2) (1 3) (1 4))
(2 3 4) → [2, (3 4)] ↦ ((2 3) (2 4))
(3 4) → [3, (4)] ↦ ((3 4))
(4) → [4, ()] ↦ ()
次に、((1 2) (1 3) (1 4))、((2 3) (2 4))、((3 4))、および () をまとめて ((1 2) を得る必要があります。 (1 3) (1 4) (2 3) (2 4) (3 4))。