3

これは私が立ち往生している宿題の問題です。明示的な再帰またはローカルを使用せずにRacketで関数を作成する必要があります。これは、各ペアの最初の要素が非負の整数であるペアのリストを取り込み、各リストがkであるリストの新しいリストを生成しますk は各ペアの最初の要素です。たとえば、 (expand-pairs (list (list 1 2) (list 3 4))) は (list (list 2) (list 4 4 4)) を生成します

いくつかのコードが機能しましたが、2 番目の要素が数値の場合のみです。質問では2番目の要素がどのタイプの要素であるかを指定していないため、どの要素でも機能する必要があると思います。したがって、私の関数は上記の例を解決できますが、(expand-pairs (list (list 1 'a) (list 3 'b))) を解決できません。

これが私のコードです:

(define (expand-pairs plst) 
  (map 
   (lambda (x) 
     (map 
      (lambda (y) (+ (first (rest x)) y)) 
      (build-list (first x) (lambda (z) (- z z)))))
   plst))

私の主な問題は、再帰またはbuild-listを使用せずに長さkのリストを作成する方法がわからないことですが、build-listを使用すると数値のリストが作成され、それを変換する方法がわかりませんシンボルのリストまたはその他の要素に。

誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

3

@RomanPekar の回答に基づいて構築された別の可能な実装を次に示しますが、Racket ではもう少し慣用的です。

(define (expand-pairs lst)
  (map (lambda (s)
         (build-list (first s) (const (second s))))
       lst))

高階手続きmapを利用し、明示的な再帰や を使用せずに実装を作成しconstます。ここでのコツは、次の式がのコピーを返す方法を理解することです。build-listlocal5x

(build-list 5 (const  'x))
            ^    ^     ^
      #copies constant element

=> '(x x x x x)
于 2013-09-29T22:55:53.997 に答える
1

このようなもの:

(define (expand-pairs plst)
  (map (lambda(x) (build-list (car x) (lambda(k) (cadr x)))) plst))

kで使用する必要はありませんbuild-list。ペアの 2 番目の要素を取るだけです。

于 2013-09-29T16:46:25.837 に答える