方案功能去除原子?

时间:2010-12-07 02:41:55

标签: scheme

如果我有一个像(e q(r))

这样的清单

如何删除所有原子并返回(())?

2 个答案:

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

经过进一步检查,对格雷格良好解决方案的微小修正现在也提供了正确的结果。具体来说:(不是(列出?xx))而不是(不是(对?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)))              ; --> (())

嗯。我想我最喜欢第二个版本!

注意,我在这里是全新的,但我希望这会有所帮助。

答案 1 :(得分: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)))))))

如果列表为空,则返回空列表。如果它是一个原子(或者更确切地说,不是一个列表),那就消除它。如果它是一个列表,则在汽车和列表的cdr上递归调用该函数。