我遇到的问题是从列表中删除第一次出现的指定元素。我不能平等使用。我做错了什么?
(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
答案 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