方案 - 如何不平整'列表中的对?

时间:2017-11-30 17:45:48

标签: scheme flatten

我的任务是获得结构中的第一个原子,这就是为什么我使用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)))))) 

2 个答案:

答案 0 :(得分: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。

答案 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))