【问题标题】:Replicate A Given Element in a List in Scheme在 Scheme 的列表中复制给定元素
【发布时间】:2016-01-13 08:01:44
【问题描述】:

所以我正在编写一个方案函数,它接收一个元素和一个列表并返回复制元素的列表,即(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)))))

【问题讨论】:

    标签: list recursion scheme racket replicate


    【解决方案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)
    

    作为一项改进,我建议您在replicate_helpermember? 中将eq? 替换为equal?,请参阅此post 以了解原因。

    但是等等,我们可以走得更远:我们不需要 三个 程序来解决这个问题,如果我们小心处理基本情况,一个程序就足够了 - 这就是我意思是:

    (define (replicate elmt set)
      (cond ((null? set) '())
            ((equal? (car set) elmt) (cons elmt set))
            (else (cons (car set)
                        (replicate elmt (cdr set))))))
    

    【讨论】:

      猜你喜欢
      • 2011-04-30
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多