如果我有一个像(e q(r))
这样的清单如何删除所有原子并返回(())?
答案 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上递归调用该函数。