2013-04-28 42 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)))))) 

测试:

(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

变化=等于?

(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

如果'(车名单)'是不是一个数字,'(=位数(车名单) )'会导致错误。 – 2013-04-28 19:45:37

+0

@愿意..现在改成'eqv?'。 – 2013-04-28 19:50:06