Копировать данный элемент в списке в схеме

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