从列表和子列表中删除成员的方案函数

Bob*_*ski 1 recursion scheme list member

首先,如果有人可以找到已经回答过的问题,请告诉我。我能找到的只是删除重复项的函数。

无论如何,我正在尝试编写一个方案函数(delete V L),该函数接受一个值和一个列表作为参数,并从列表及其所有子列表中删除该值。例如,给定以下输入:

> (deep-delete 3 '(1 2 3 (4 3) 5 (6 (3 7)) 8)) 
Run Code Online (Sandbox Code Playgroud)

它将产生:

(1 2 (4) 5 (6 (7)) 8) 
Run Code Online (Sandbox Code Playgroud)

到目前为止,这就是我所写的,但我知道 if 语句(用于检查该元素是否是子列表,这意味着它也必须被操作)必须放置错误。另外,我无法思考应该在哪里使用cons和不应该在哪里使用,因为我仍然对跟踪递归的返回值感到困惑。有人可以看一下并解释我做错了什么吗?

(define (delete V L)
   (if (list? (car L)) (cons (delete V (car L) (cdr L)))     
   (cond
      ((null? L) L)
      ((equal? V (car L)) (delete V (cdr L)))
      (else (cons (car L) (delete V (cdr L))))))))
Run Code Online (Sandbox Code Playgroud)

Jay*_*Jay 5

我对你的代码有几点评论:

  • 首先,在您的if声明中,您使用时(car L)不检查是否L为空。
  • 另外,在代码的第 2 行中,您执行:(delete V (car L) (cdr L)),但cons采用两个参数,而不是三个。而且您忘记了递归delete调用cdr. 你自找的: (cons (delete V (car L)) (delete V (cdr L)))
  • 为什么不使用单个cond?由于存在多种情况,使用cond将使算法的递归结构更加明显,并且更容易捕获错误。

见下文。

(define (del V L)
  (cond ((null? L) L)
        ((list? (car L))
         (cons (del V (car L)) (del V (cdr L))))
        ((equal? V (car L)) (del V (cdr L)))
        (else (cons (car L) (del V (cdr L))))))
Run Code Online (Sandbox Code Playgroud)

这将递归地V从 中删除L

(del 3 '(1 2 3 (4 3) 5 (6 (3 7)) 8))
==> (1 2 (4) 5 (6 (7)) 8) 
Run Code Online (Sandbox Code Playgroud)