2017-11-30 13 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) 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))) 

다음

> (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 

참고,하지만 난 평평 목록의 첫 번째 요소는 (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))