Scheme 去除原子的方案功能?

Scheme 去除原子的方案功能?,scheme,Scheme,如果我有一个像e qr这样的列表 我怎样才能去掉所有的原子,然后再回来呢 (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))))))) 如果列表为空,则返回空列表。如果它是一个原子,或者更确

如果我有一个像e qr这样的列表

我怎样才能去掉所有的原子,然后再回来呢

(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)))))))
如果列表为空,则返回空列表。如果它是一个原子,或者更确切地说,不是一个列表,只需删除它。如果它是一个列表,则在car和列表的cdr上递归调用该函数


如果列表为空,则返回空列表。如果它是一个原子,或者更确切地说,不是一个列表,只需删除它。如果它是一个列表,则在car和列表的cdr上递归调用该函数。

嘿,一种称为树递归的技术对于此类问题很有用

我同意格雷格答案的一般结构,但我认为我们需要从嵌套列表中显式过滤原子非列表值

(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)))              ; --> (())
经过进一步检查,对Greg的“好的解决方案”的微小修改现在也提供了正确的结果。具体来说:不是名单?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)))              ; --> (())
嗯,我想我最喜欢第二个版本了


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

嘿,一种称为树递归的技术对这类问题很有用

我同意格雷格答案的一般结构,但我认为我们需要从嵌套列表中显式过滤原子非列表值

(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)))              ; --> (())
经过进一步检查,对Greg的“好的解决方案”的微小修改现在也提供了正确的结果。具体来说:不是名单?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)))              ; --> (())
嗯,我想我最喜欢第二个版本了


请注意,我是新来的,但我希望这能有所帮助。

很好的解决方案,谢谢你纠正我的错误。我忘了空列表不能与pair一起使用?使用列表的问题?这有两个方面:1。它必须遍历整个列表来确定它是否是一个正确的列表,每次都是?不需要遍历,和2。您是否也要删除不正确的列表?它们不是原子。我想是一双还是一双?foo空?foo更合理。很好的解决方案,谢谢你纠正我的错误。我忘了空列表不能与pair一起使用?使用列表的问题?这有两个方面:1。它必须遍历整个列表来确定它是否是一个正确的列表,每次都是?不需要遍历,和2。您是否也要删除不正确的列表?它们不是原子。我想是一双还是一双?foo空?foo更合理。