Функция Scheme - взять атом и список и вернуть новый список, где вхождения данного атома удалены из данного списка - PullRequest
0 голосов
/ 21 мая 2018
(define (remover lst n)
    (cond ((null? lst) ())
        ((eq? (car lst) n) (cdr lst))
        (else (cons (car lst) (remover (cdr lst) n)))))

(remover 'f '(a f c g f b))

Этот код генерирует следующую ошибку.

car: ожидает аргумент типа;учитывая ф

1 Ответ

0 голосов
/ 21 мая 2018

Вы, кажется, звоните remover с замененными аргументами.Если вы назовете это так:

(remover '(a f c g f b) 'f)

, вы получите результат (a c g f b).

Поскольку вы хотите удалить все вхождения f, вам также придется изменить(cdr lst) в (remover (cdr lst) n), вот так:

(define (remover lst n)
    (cond ((null? lst) ())
        ((eq? (car lst) n) (remover (cdr lst) n))
        (else (cons (car lst) (remover (cdr lst) n)))))

Тогда (remover '(a f c g f b) 'f) также должен дать ожидаемый результат (a c g b).

Чтобы переключить аргументы remover, вы должны включить их в определении и для обоих рекурсивных вызовов, например:

(define (remover n lst)
    (cond ((null? lst) ())
        ((eq? (car lst) n) (remover n (cdr lst)))
        (else (cons (car lst) (remover n (cdr lst))))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...