0

我对从列表中删除第一次出现的指定元素的函数有疑问。我不能使用相等。我做错了什么?

 (define f
  (lambda (E X)
    (list? X)
    (check E X)))

(define check
  (lambda (E X)
    (cond ((eq?(cdr X) '()) 'no_occur)
          (#t (cond
                ((eq?(car X)E) (cdr X))
                (#t (cons '()
                          (cons (car X)
                                (check E (car X))))))))))

(f 'u '(k u l o))

我明白了:
mcdr:
预期违反合同:mpair?
给定:k

4

2 回答 2

0

更改最少的解决方案。请注意,最后一次调用 check (check E (cdr X)) 使用的是 cdr 而不是 X 的 car。为什么?

#lang racket
(define f
  (lambda (E X)
    (if (list? X)
        (check E X)
        #f)))

(define check
  (lambda (E X)
    (cond ((eq? X '()) 'no_occur)
          (#t (cond
                ((eq? (car X) E) (cdr X))
                (#t (cons (car X)
                          (check E (cdr X)))))))))

(f 'u '(k u l o))
于 2014-11-07T13:41:58.473 回答
0
 (define f
  (lambda (E X)
    (if (list? X)
        (check E X)
        "Your error message")))


(define check
  (lambda (E X)
    (cond ((eq? (cdr X) '()) 'no_occur)          ; what if it's the last symbol?
          ((eq?(car X) E) (cdr X))               ; no need to nest cond's
          (else (cons (car X)                    ; In scheme we use else
                      (check E (cdr X)))))))     ; you search the rest of the 
                                                 ; list. This line cuased your
                     ; error message. You called check with X=k (the car of '(k u l o))

我也没有删除cons '()你不需要每次都使用空列表。另外,请注意这个测试

> (f 'a '(k u l o))
 '(k u l . no_occur)

我把它留给你来解决这个问题。;-P

于 2014-11-07T13:50:56.590 回答