2016-11-14 13 views
0

私はこの2つのリストからペアのリストを返すことになっています。たとえば、(ペア '(1 2 3)'(a b c))は'((1.a)(2.b)(3.c))を返す必要があります。Scheme - 与えられた2つのリストからペアのリストを返します。

これはこれまでの私の論理です。私は各リストの最初の要素を取り、再帰的に新しい引数としてcdrを使って手続きを呼び出します。私の結果は次のようなリストを返しています:(1 a 2 b 3 c)

ここで私のロジックは間違っていますか?どこかで欠けているリストがあることはわかっていますが、私はSchemeの専門家ではありません。

提案がありますか?あなたが(cons 1 3)を評価して(1 . 3)として出力する値を生成

(define pairs 
     (lambda (x y) 
     (if (or (null? x) (null? y)) 
      '() 
      (cons (car x) 
      (cons (car y) 
       (pairs (cdr x)(cdr y))))))) 

    (pairs '(1 2 3) '(a b c)) 
+0

@Oscar:彼はこの試みでは、特定の欠陥について尋ねられたので、私はリニューアルオープン - 問題の完全な解決を求めるよりもむしろ。 – soegaard

答えて

1

あなたが探している結果は次のようになります。実際には

((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)) 

テスト:

2

注意してください。しかしあなたのプログラムでは、(cons 1 (cons 3 ...))をやっています。これは、次のリストの1と3の前に置かれます。

(cons (car x) (cons (car y) (pairs ...)) の代わりに(cons (cons (car x) (car y) (pairs ...))を使用してください。

1

map使用すると、それをたくさん簡素化

(pairs '(1 2 3) '(a b c)) 

出力:

'((1 a) (2 b) (3 c)) 
関連する問題