[英]Replicate A Given Element in a List in Scheme
所以我正在編寫一個方案函數,該函數接受一個元素和一個列表,並返回帶有復制元素的列表,即(replicate 'd '(abc 1 d))
應該返回'(abc 1 dd))
。
但是,只要元素不屬於列表,則返回的只是原始列表,如果元素不屬於列表,則返回的只是列表。 我是新手,無法找到我的錯誤所在。 非常感謝您的幫助!
(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)))))
這是一個簡單的錯誤:一對夫婦括號中的第一個條件是失蹤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?
,請參閱這篇文章以了解原因。
但是,等等,我們可以走得更遠:我們不需要三個過程來解決這個問題,如果我們對基本情況謹慎的話,一個過程就足夠了-這就是我的意思:
(define (replicate elmt set)
(cond ((null? set) '())
((equal? (car set) elmt) (cons elmt set))
(else (cons (car set)
(replicate elmt (cdr set))))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.