Схема функции для удаления атомов? - PullRequest
1 голос
/ 07 декабря 2010

Если у меня есть список вроде (e q (r))

Как бы удалить все атомы и просто вернуть (())?

Ответы [ 2 ]

3 голосов
/ 07 декабря 2010

Эй, метод, известный как древовидная рекурсия, полезен для такого типа проблем.

Я согласен с общей структурой ответа Грега, но я думаю, что мы должны явно фильтровать атомарные (не списочные) значения из вложенных списков.

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

После дальнейшей проверки крошечная поправка к хорошему решению Грега также теперь дает правильные результаты. В частности: (не (список? Хх)), а не (нет (пара? Хх)).

(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 голос
/ 07 декабря 2010
(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 списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...