2014-09-22 88 views
1

我需要做一个函数,我发送一个值,并检查列表中是否有相同的值来删除它。下面是一些例子:SCHEME从列表中删除原子值

(elimina 1 '(a b c))   => (a b c) 
(elimina 'b '(a (b) c))   => (a() c) 
(elimina 1 '(0 (1 (2) 1) 0)) => (0 ((2)) 0) 

我尝试这样做:

(define (elimina v1 lista) 
    (cond ((null? lista)'()) 

     ((list? (first lista)) 
     (list (elimina v1 (first lista)))) 

     (else 
     (if(equal? v1 (first lista)) 
      (elimina v1 (cdr lista)) 
      (append (cons (first lista) (elimina v1 (cdr lista)))))) 
    ) 
) 

我的结果,其中这样的:

(elimina 1 '(a b c))   => (a b c) 
(elimina 'b '(a (b) c))  => (a()) 
(elimina 1 '(0 (1 (2) 1) 0) => (0 ((2))) 

由于某些原因,名单上的最后一个值不显示。希望有人能帮忙。

谢谢!

回答

0

1)你的问题是在这里:

((list? (first lista)) 
     (list (elimina v1 (first lista)))) 

当你递归到子列表,你不处理列表的其余部分了。

2)此外,

(append (cons (first lista) (elimina v1 (cdr lista)))))) 

可以简化,因为要追加一个列表,什么都没有,所以刚落append

3)不是错误,但我建议你使用要么firstsecondrest ... carcadrcdr ...

尝试:

(define (elimina v1 lista) 
    (cond 
    ((null? lista) '()) 
    ((list? (first lista)) 
    (cons (elimina v1 (first lista)) (elimina v1 (rest lista)))) ; <= (1) 
    (else 
    (if (equal? v1 (first lista)) 
     (elimina v1 (rest lista)) 
     (cons (first lista) (elimina v1 (rest lista)))))))  ; <= (2) 
+0

谢谢非常! – 2014-09-23 00:41:58