2010-12-07 9 views

答えて

1
(define rem-atoms 
(lambda (lat) 
    (cond 
    ((null? lat) lat) 
    ((not (pair? (car lat))) (rem-atoms (cdr lat))) 
    (else 
    (cons (rem-atoms (car lat)) (rem-atoms (cdr lat))))))) 

リストが空の場合は、空のリストを返します。それがアトム(またはリストではない)の場合は、それを除去するだけです。それがリストの場合は、リストのcarとcdrの両方で関数を再帰的に呼び出します。

3

こんにちは、ツリー再帰と呼ばれる手法は、この種の問題に役立ちます。

私はGregの回答の一般的な構造に同意しますが、ネストされたリストからアトミック(非リスト)値を明示的にフィルタリングする必要があると思います。さらに検査時に

(define (rem-atoms lst) 
    (cond 
    ((not (list? lst)) lst) 
    ((null? lst) (list)) 
    (else 
     (filter 
     (lambda (a) (list? a)) 
     (cons (rem-atoms (car lst)) 
       (rem-atoms (cdr lst))))))) 

(rem-atoms '(f (x y) z() (k()))) ; --> (()() (())) 
(rem-atoms '(f x (y)))    ; --> (()) 

、Gregの良い解決策への小さな修正は今も正しい結果を提供します。具体的には:(not(pair?xx))ではなく(not(list?xx))。

(define (rem-atoms lat) 
    (cond 
    ((null? lat) lat) 
    ((not (list? (car lat))) (rem-atoms (cdr lat))) 
    (else 
     (cons (rem-atoms (car lat)) 
      (rem-atoms (cdr lat))))))) 

(rem-atoms '(f (x y) z() (k()))) ; --> (()() (())) 
(rem-atoms '(f x (y)))    ; --> (()) 

Hmm。私はこの2番目のバージョンが一番好きだと思います!

私はここで新しいですが、これが役立つことを願っています。

+0

私の間違いを解消してくれてありがとう。私は空リストがペアで動作しないことを忘れましたか? – Greg

+1

'list?'を使用する際の問題は2つあります:1.リスト全体をトラバースして、毎回( 'pair? 'はトラバースする必要がないのに対して)適切なリストであるかどうかを判断しなければなりません。不適切なリストも削除しますか?彼らは原子ではありません。私は '(or(pair?foo)(null?foo))'のようなものがより合理的だと思います。 –

+0

ありがとう、クリス。あなたが正しいです! –

関連する問題