所以我正在编写一个scheme函数,它接受一个元素和一个列表,并返回包含复制元素的列表,即(replicate 'd '(a b c 1 d))
应该返回'(a b c 1 d d))
。
然而,只要元素不是列表的一部分,它返回的就是原始列表。我是新手,无法找到错误的位置。我很感激你的帮助!
(define (replicate elmt set)
(cond((null? set) '())
((member? elmt set)(replicate_helper elmt set))
(else set)))
(define (replicate_helper elmt set)
(cond (eq? (car set) elmt) (cons elmt set)
(else (cons (car set)
(replicate_helper elmt (cdr set))))))
也是会员?是我的函数,当一个元素在列表中时返回#t,当没有时返回#f。这是它的样子:
(define (member? elmt set)
(cond ((null? set) #f)
((eq? elmt (car set)) #t)
(else(member? elmt (cdr set)))))
答案 0 :(得分:1)
这是一个简单的错误:replicate_helper
的第一个条件中缺少几个括号。只需用以下内容替换您的实现:
(define (replicate_helper elmt set)
(cond ((eq? (car set) elmt) (cons elmt set))
(else (cons (car set)
(replicate_helper elmt (cdr set))))))
它应该按预期工作:
(replicate 'd '(a b c 1 d))
=> '(a b c 1 d d)
(replicate 'x '(a b c 1 d))
=> '(a b c 1 d)
作为改进,我建议您将eq?
替换为equal?
和replicate_helper
中的member?
,请参阅此post以了解原因。
但是等等,我们可以更进一步:我们不需要三个程序来解决这个问题,如果我们小心基本情况,单个程序就足够了 - 这就是我的意思意味着:
(define (replicate elmt set)
(cond ((null? set) '())
((equal? (car set) elmt) (cons elmt set))
(else (cons (car set)
(replicate elmt (cdr set))))))