6

私がリストを持っているとしましょう:(a b ((c)) (d + e) ((e + f)) (g) () h)

次のリストを取得するにはどうすればよいですか(できれば関数を使用して):(a b c (d + e) (e + f) g h)

言い換えると:

  • ネストされたリストに要素が1つしかない場合は、その要素に簡略化されます。これは((c))、上記の例ではcだけに簡略化されています。また((e + f))になり(e + f)ます。

  • ネストされたリストに複数の要素がある場合、それは同じままです。それは上記の例のように(d + e)残ります。(d + e)

  • ネストされたリストがnullの場合、それは単に削除されます。

最後に、この場合、フラット化という用語が適用されるかどうかはわかりません。私の質問が明確であることを願っています。そうでない場合は、私に知らせてください。

前もって感謝します!

4

2 に答える 2

5

このコードで試してください:

(define (atom? x)
  (and (not (pair? x)) (not (null? x))))

(define (strip lst)
  (if (or (null? lst) (atom? lst) (not (null? (cdr lst))))
      lst
      (strip (car lst))))

(define (flatten lst)
  (cond ((or (null? lst) (atom? lst))
         lst)
        ((null? (strip (car lst)))
         (flatten (cdr lst)))
        (else
         (cons (flatten (strip (car lst))) (flatten (cdr lst))))))

あなたの例でテストすると、期待される答えが得られます。

> (flatten '(a b ((c)) (d + e) ((e + f)) (g) () h))
> (a b c (d + e) (e + f) g h)
于 2011-10-15T18:55:15.540 に答える
0

アイデアは、次のような再帰関数が必要であるということです。

  1. リストが空かどうかを確認します
  2. 最初の項目がリストであるかどうかをチェックし、そうでない場合は、リストにcons適用されている関数にチェックcdrします
  3. carそれ以外の場合は、関数をandcdrconsingの両方に適用します。

これがテストされていない試みです:

(define flatten
  (lambda lst
    (cond 
      ((null? lst) lst)
      ((atom? (car lst)) (cons (car lst) (flatten (cdr lst))))
      (else (cons (flatten (cons (car (car lst) (cdr (car ls))) 
                  (flatten (cdr lst)))))))

atom?リスト内の要素がリストではないかどうかをテストする関数はどこにありますか。TheLittleSchemerでatom?定義は次のとおりです。

(define atom?
  (lambda (x)
    (and (not (pair? x)) (not (null? x)))))

再帰関数のロジックを整理するのに問題がある場合は、TheLittleSchemerを強くお勧めします。

于 2011-10-15T08:39:17.833 に答える