У меня есть фрагмент кода, который может получить пересечение двух списков. Однако я хочу удалить все дубликаты из списка. Я использую функцию remove-duplicates()
. Всякий раз, когда я его использую, drRacket дает следующую ошибку.Удаление дубликатов из списка пересечений в схеме
заявление: не является процедурой; ожидается процедуру, которая может быть применена к аргументам Дано: (abccd) аргументы ...: [нет]
Вот мой код
#lang scheme
(define (intersect lst1 lst2)
(removedup(lst1 lst2))
(cond
((null? lst1)(quote()))
((isin? (car lst1) lst2)
(cons (car lst1)
(intersect (cdr lst1) lst2)))
(else (intersect (cdr lst1) lst2))))
(define (removedup lst1 lst2)
(remove-duplicates(lst1))
(remove-duplicates(lst2))
)
(define (isin? a lat)
(cond
((null? lat) #f)
(else (or (equal? (car lat) a)
(isin? a (cdr lat))))))
Мой вход > (intersect '(a b c c d) '(c d e f))
Может ли кто-нибудь помочь мне решить мою проблему? Заранее спасибо
Спасибо! Удалось устранить ошибки. Однако я все еще не получаю результат, который я хочу. Мой вход -> (пересекается '(a b c c d)' (c d e f)). И мой вывод: (c c d). Я хочу, чтобы мой результат был (c d). – LvanRooij
@LvanRooij Racket - это функциональный язык программирования, и большинство функций чисты, когда это возможно. 'remove-duplicates' не изменяет свои аргументы (фактически, списки неизменяемы в Racket), он просто возвращает новый список с удаленными дубликатами. Вы должны обернуть свое возвращаемое значение с помощью 'remove-duplicates', а не пытаться вызвать его для побочного эффекта. –
Тестовые чеки являются ключевыми, здесь. Кроме того, если вы не знаете, как функции оцениваются, попробуйте использовать stepper для создания вашей интуиции. Чтобы стать программистом, нужно формулировать гипотезы о том, что происходит, и тестировать их. –