1

リスト内のすべてのサブリストの最初の要素を削除しようとしています。すべてのサブリストの cdar が必要です。マップを使ってみましたが、うまくいきませんでした。なぜか隙間ができます。代わりに再帰を使用する必要がありますか?

私のコード:

(define (rd data)
 (map (lambda (x)
        (if (null? x)
            (cdar x))) 
      data))

これ欲しい:

'((1 (r (3 4))) (4 (d (5 6)))) -> ((r (3 4)) (d (5 6)))

私は何を間違っていますか?

4

2 に答える 2

1

コードについて: に渡されるプロシージャは、要素がでmapあるかどうかをテストする必要はなく、その部分を処理します。この手順は、各要素に対して行われること処理するだけでよく、それをリストの各要素に順番に適用し (この場合、要素はたまたまサブリストになります)、結果のリストを返します。nullmapmap

上記を理解すると、プロシージャは各サブリストの 2 番目の要素を抽出するだけでよいことに注意してください。より簡単な解決策は、次のように書くことです。

(define (rd data)
  (map (lambda (x) (cadr x)) data))

...しかし、それは冗長すぎます。cadr各要素に順番に適用しているだけで、他には何も適用していません。これは次のようになります。

(define (rd data)
  (map cadr data))

...またはさらに明確に (Racket で動作):

(define (rd data)
  (map second data))

いずれにせよ、結果は期待どおりです。

(rd '((1 (r (3 4))) (4 (d (5 6)))))
=> '((r (3 4)) (d (5 6)))
于 2013-04-04T02:37:00.057 に答える