あなたが探している結果は次のようになります。実際には
((1 a) (2 b) (3 c))
この構造は次のようになります。
(cons
(cons 1 a)
(cons
(cons 2 b)
(cons
(cons 3 c)
'()
)
)
)
だから何あなたが探しているのはペアを追加することですリストにすべての項目を追加するのではなく、リストに追加することができます。単にあなたの結果は以下のようになります。
(1 (2 (pairs ...)))
あなたのコードは次のようになります。
(define pairs
(lambda (x y)
(if (or (null? x) (null? y))
'()
(cons
(cons (car x) (car y))
(pairs (cdr x) (cdr y))))))
このコードはうまくいくかもしれないが、それは完璧ではありません。関数の末尾を再帰的にするために、コードを3番目のパラメータとして作成したリストに渡すことができます。
(define pairs
(lambda (x y)
(let next ((x x) (y y) (lst '()))
(if (or (null? x) (null? y))
(reverse lst)
(next (cdr x)
(cdr y)
(cons
(cons (car x) (car y))
lst))))))
あなたが見ることができるように、我々はリストの先頭に次の要素を追加しているここで以来、私たちは最後にlst
を逆にする必要があります。
あなたはこのような何かを持っていると思います。ここでの違いは、next
が呼び出されるたびにxとyの各状態をメモリに保持する必要がないことです。名前付きletが返ってくると、呼び出された場所にすべての値をポップする必要はありません。それは単に逆のリストを返します。代わりにreverse
を使用しての我々は単にlst
を返し、リストの最後にペアを追加することになる(append lst (cons (car x) (car y)))
を使用することができます...リストがリストにリンクされているので、...の最後に何かを追加するために、言った
リスト、スキームはすべてのリスト項目を歩かなければならない...マイグレーションは大きなリストでは良くない。だから解決策は、すべてを追加し、最後にあなたが望むようにリストを並べ替えることです。逆の操作は1回だけ起こります。
(define (pairs x y)
(map (λ (i j) (list i j)) x y))
テスト:
@Oscar:彼はこの試みでは、特定の欠陥について尋ねられたので、私はリニューアルオープン - 問題の完全な解決を求めるよりもむしろ。 – soegaard