Копировать данный элемент в списке в схеме
Итак, я пишу функцию схемы, которая принимает один элемент и один список и возвращает список с реплицированным элементом, т.е. (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 ответ
Это была простая ошибка: пара скобок отсутствовала в первом условии 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))))))