2017-11-30 11 views
0

私の仕事は最初の原子を構造体に入れることです。そのため、私はflattenとfunc "first-atom-lst"を使っています。しかし、一つの大きな問題があります - 私はペアで構造を扱う必要があり、ペアを壊さないでください。これを処理するのを手伝ってもらえますか?スキーム - リスト内のペアを「平坦化」しない方法は?

(define (check-improper? lst) 
    (cond 
     ((null? lst) #f) 
     ((number? lst) #f) 
     ((atom? lst) #f) 
     ((list? lst) #f) 
    ((pair? (cdr lst)) #t) 
    (#t #f) 
)) 

(define (improper-to-proper lst) 
    (cond 
    ((null? lst) '()) 
    ((not (pair? (cdr lst))) (cons lst '())) 
    (else (cons (car lst) (improper-to-proper (cdr lst)))) 
    ) 
) 

(define (first-atom-from-pair lst) 
    (cond ((check-improper? lst)) 
     ((null? lst) #f) 
     ((atom? (car (flatten lst)))   
     (car (flatten lst)))     
     (else      
     (first-atom (cdr (flatten lst)))))) 

(define (first-atom lst) 
    (cond ((check-improper? lst)) 
     ((null? lst) #f) 
     ((atom? lst) lst) 
     ((pair? (cdr lst)) (first-atom-from-pair lst)) 
     ((pair? lst) #f) 
     ((atom? (car (flatten (not pair? lst))))   
     (car (flatten (not pair? lst))))     
     (else      
     (first-atom (cdr (flatten lst)))))) 
+0

入力の表示と予想される出力 – naomik

+0

冗長ペアとは何ですか?例えば – Sylwester

+0

- 入力:((2 0)2) 期待出力:2 入力:((1 0)(2 3)2) 出力:2 入力:((2 1)。 (2 3)1) outpit:2 – Artem

答えて

0

不適切なリストを平坦化することはできませんが、とにかくあなたのケースでは実際には過剰です。

(define (first-atom tree) 
    (if (null? tree) 
     #f 
     (if (pair? tree) 
      (first-atom (car tree)) 
      tree))) 

私の2番目の結果はあなたとは異なり、私はフラット化リストの最初の要素はまた、1をもたらすであろうことから鉱山が正しいと信じて、その後

> (first-atom '((2 . 0) 2)) 
2 
> (first-atom '((1 . 0) (2 . 3) 2)) 
1 
> (first-atom '((2 . 1) (2 3) 1)) 
2 
> (first-atom '(((((((1 . 2) 3) 4)))))) 
1 

注:あなたはこのような何かを行うことができます。

0

問題を解決しますが、改善が必要です。

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

(define (true-pair? p) 
    (cond 
    ((list? p) #f) 
    ((pair? (cdr p)) #f) 
    (else #t))) 

(define (flatten-atom x) 
    (cond ((null? x) '()) 
     ((atom? x) (list x)) 
     ((true-pair? x) (list x)) 
     (else (append (flatten-atom (car x)) 
         (flatten-atom (cdr x)))))) 

(flatten-atom '((a b . c))) 
(flatten-atom '((a b c) d e() ((f)) (1 . 2))) 
(flatten-atom '((a b . c) (((4 5)))() 6 (7 . 8))) 

> (a (b . c)) 
> (a b c d e f (1 . 2)) 
> (a (b . c) 4 5 6 (7 . 8)) 
関連する問題