2

HTDPの演習 17.1.2 の質問に行き詰まっています。これは私がこれまでに得たものです:

(define (cross alist1 alist2)
  (cond
    [(empty? alist1) empty]
    [else (append (list (first alist1)(first alist2))
                  (cons (first alist1)(list (first (rest alist2))))
                  (cross (rest alist1) alist2))]))

(cross '(a b c) '(1 2))
;correctly outputs (list 'a 1 'a 2 'b 1 'b 2 'c 1 'c 2)

これはテスト ケースでは機能しますが、2 番目のリストに 2 つ以上の要素がある場合、関数は崩壊します。

(cross '(a b c) '(1 2 3))
;outputs (list 'a 1 'a 2 'b 1 'b 2 'c 1 'c 2)

2 番目のリストから最大 2 つの要素をコンスするだけなので、問題は追加後の 2 行目にあるようです。これを解決するにはどうすればよいですか?洞察をありがとう。:)

4

1 に答える 1

2

リスト 2 の 2 つの要素に対してのみ機能するように指定したため、リスト 2 の 2 つの要素に対してのみ機能します。抽象化の力を活用する必要があります。

命令型言語で作業している場合は、ネストされた for ループをこの問題に使用します。alist1 の最初の要素から開始し、alist2 のすべての要素と一致させます。次に、alist1 の 2 番目の要素に移動し、alist2 のすべての要素と一致させます。関数型言語 (Scheme) で作業しているため、ネストされた for ループの代わりにネストされた関数を使用します。

'a と '(1 2 3) を取り、'(a 1 a 2 a 3) を生成する関数を作成し、次に別の関数を作成して、'a のさまざまな値で最初の関数を呼び出すとします。以下のソリューションを台無しにしたくない場合は、無視する必要がある関連コード。

(define (cross alist1 alist2)
 (cond
  ((null? alist1) '())
  (else 
   (append (innercross (car alist1) alist2)
           (cross (cdr alist1) alist2)))))

(define (innercross a1 alist2)
 (cond
  ((null? alist2) '())
  (else
   (cons a1 (cons (car alist2) (innercross a1 (cdr alist2)))))))
于 2010-12-27T05:18:35.797 に答える