Racket - Удалить ключ из списка ассоциаций - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь написать функцию, которая использует число, ключ и список ассоциаций al, и создает список ассоциаций, полученный в результате удаления ключа из al. Например:

(check-expect (remove-al 5 (list (list 4 "A") (list 5 "B") (list 1 "C")))
              (list (list 4 "A") (list 1 "C")))

Мне не разрешено использовать определенные функции, такие как отображение, фильтрация или удаление, но мне удалось написать это до сих пор. Ниже мой код:

define (remove-al key al)
  (cond
    [(empty? al) empty]
    [(= key (first (first al))) empty]
    [else (cons (first al)
                (remove-al key (rest al)))]))

Какая часть моего кода неверна?

1 Ответ

0 голосов
/ 28 октября 2019

Концепция этого алгоритма заключается в том, чтобы рассматривать его в терминах расширенной реализации дополнения. Если вы хотите посмотреть реализацию append в Racket, то это рекурсивный алгоритм, в котором базовый случай проверяет, является ли список rhs пустым, но если нет, то содержит первое значение списка lhs и результат рекурсивного вызова состальная часть списка lhs и rhs. Здесь - ссылка на реализацию. Алгоритм является просто реализацией добавления с дополнительной проверкой, чтобы убедиться, что игнорируется рекурсивный вызов cons, если первый элемент списка соответствует ключу.

СПОЙЛЕРЫ

---->

(define (remove-al key lhs rhs)
  (cond [(empty? lhs) rhs]
        [else (cond [(not (=(first (first lhs)) key))
                     (cons (first lhs) (remove-al key (rest lhs) rhs))]
                    [else (remove-al key (rest lhs) rhs)])]))

(check-expect (remove-al 5 (list (list 4 "A") (list 5 "B") (list 1 "C")) '() )
              (list (list 4 "A") (list 1 "C")))
...