方案。列表中的递归等价检查

时间:2014-11-07 07:13:30

标签: scheme racket r5rs

我遇到的问题是从列表中删除第一次出现的指定元素。我不能平等使用。我做错了什么?

 (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

2 个答案:

答案 0 :(得分:0)

最小变化的解决方案。请注意,最后一次检查(检查E(cdr X))使用的是cdr,而不是X的车。为什么?

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

答案 1 :(得分: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