2013-04-28 8 views
1

Мне нужно полностью удалить данную цифру из списка. Это было бы ввести: (remove-digit 1 '(1 2 3 '(4556 1)))Схема удалить из списка

Мне нужно вернуть (2 3 (4556)) можно удалить из списка с помощью этого кода:

(define (remove-digit digit list) 
    (cond ((null? list) list) 
     ((= digit (car list)) (remove-digit digit (cdr list))) 
     (else (cons (car list) (remove-digit digit (cdr list)))))) 

Но не может удалить из списков в списках. Любая помощь очень ценится

ответ

0
(define (rem-dig n ds) 
    (cond 
    ((list? ds) 
     (remove-digit n (map (lambda(d)(rem-dig n d)) ds))) 
    (else ds))) 

нужно заменить предикат равенства из числа конкретных = к общему equal?:

(define (remove-digit digit list) 
    (cond ((null? list) list) 
     ((equal? digit (car list)) (remove-digit digit (cdr list))) 
     (else (cons (car list) (remove-digit digit (cdr list)))))) 

Testing:

(rem-dig 1 '(1 2 3 (4556 1))) 
;Value 13: (2 3 (4556)) 

Если неверное, пунктирную списки разрешены, он должен быть изменен,

(define (rem-dig n ds) 
    (cond 
    ((list? ds) 
     (remove-digit n (map (lambda(d)(rem-dig n d)) ds))) 
    ((pair? ds) 
     (let* ((x (last-pair ds)) 
       (y (cdr x)) 
       (z (set-cdr! x())) 
       (ds (rem-dig n ds)) 
       (x (last-pair ds))) 
     (if (not (equal? n y)) 
      (set-cdr! x y)) 
     ds)) 
    (else ds))) 
0

change = to equal?

(define (remove-digit digit list) 
    (cond ((null? list) list) 
     ((equal? digit (car list)) (remove-digit digit (cdr list))) 
     (else (cons (car list) (remove-digit digit (cdr list)))))) 

(display (remove-digit 1 '(1 2 3 (4556 1)))) 
2

Вам нужно добавить пункт к cond заявления, обращения (суб) списков:

(define (remove-digit digit list) 
    (cond ((null? list) list) 
     ((eqv? digit (car list)) (remove-digit digit (cdr list))) 
     ((list? (car list)) (cons (remove-digit digit (car list)) 
            (remove-digit digit (cdr list)))) 
     (else (cons (car list) (remove-digit digit (cdr list)))))) 
+0

если '(список автомобилей)' не является числом, '(= цифра (список автомобилей)) 'приведет к ошибке. –

+0

@ Поблагодарил .. Изменен на 'eqv?' Сейчас. –

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