在 Scheme 的列表中复制给定元素
Replicate A Given Element in a List in Scheme
所以我正在编写一个方案函数,它接受一个元素和一个列表,并且 return 复制元素的列表,即 (replicate 'd '(a b c 1 d))
应该 return '(a b c 1 d d))
.
然而,只要元素不属于列表的一部分而元素属于列表的一部分,它 returns 都是原始列表。我是 scheme 的新手,无法找到我的错误所在。非常感谢您的帮助!
(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))))))
也是会员?我的函数是 returns #t 当元素在列表中时,#f 不在列表中时。这是它的样子:
(define (member? elmt set)
(cond ((null? set) #f)
((eq? elmt (car set)) #t)
(else(member? elmt (cdr set)))))
这是一个简单的错误: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_helper
和 member?
中的 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))))))
所以我正在编写一个方案函数,它接受一个元素和一个列表,并且 return 复制元素的列表,即 (replicate 'd '(a b c 1 d))
应该 return '(a b c 1 d d))
.
然而,只要元素不属于列表的一部分而元素属于列表的一部分,它 returns 都是原始列表。我是 scheme 的新手,无法找到我的错误所在。非常感谢您的帮助!
(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))))))
也是会员?我的函数是 returns #t 当元素在列表中时,#f 不在列表中时。这是它的样子:
(define (member? elmt set)
(cond ((null? set) #f)
((eq? elmt (car set)) #t)
(else(member? elmt (cdr set)))))
这是一个简单的错误: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_helper
和 member?
中的 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))))))