Если у меня есть список вроде (e q (r))Функция схемы для удаления атомов?
Как бы удалить все атомы и просто вернуться (())?
Если у меня есть список вроде (e q (r))Функция схемы для удаления атомов?
Как бы удалить все атомы и просто вернуться (())?
(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 в списке.
Эй, метод, известный как рекурсия дерева, полезен для этого типа проблем.
Я согласен с общей структурой ответа Грега, но я думаю, что нам нужно явно фильтровать атомные (не-список) значения из вложенных списков.
(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))) ; --> (())
При дальнейшей проверке крошечная поправка к хорошему решению Грега также дает правильные результаты. В частности: (not (list? Xx)), а не (not (pair? 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))) ; --> (())
Хмм. Мне кажется, мне нравится эта вторая версия!
Примечание. Здесь я новичок, но, надеюсь, это поможет.
Хорошее решение, и спасибо, что выбрали мою ошибку. Я забыл, что пустые списки не будут работать с парой? – Greg 2010-12-07 04:40:36