1

我需要执行一个发送值的函数,并在列表中检查是否有相等的值以将其删除。这里有些例子:

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

由于某种原因,列表中的最后一个值没有显示。希望有人可以提供帮助。

谢谢!

4

1 回答 1

0

1)你的问题在这里:

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

当您递归到子列表时,您不再处理列表的其余部分。

2)另外,

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

可以简化,因为您将列表添加到任何内容中,所以只需 drop append

3) 不是错误,但我建议您使用 first, second, rest... car, cadr, cdr...

尝试:

(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)
于 2014-09-22T04:19:51.537 回答