2010-12-07 2 views

ответ

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 в списке.

3

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

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

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

Хмм. Мне кажется, мне нравится эта вторая версия!

Примечание. Здесь я новичок, но, надеюсь, это поможет.

+0

Хорошее решение, и спасибо, что выбрали мою ошибку. Я забыл, что пустые списки не будут работать с парой? – Greg 2010-12-07 04:40:36

Смежные вопросы