在Scheme

时间:2015-10-15 02:22:15

标签: list recursion scheme racket replicate

所以我正在编写一个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)))))

1 个答案:

答案 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))))))