Итак, я работаю над некоторым кодом (прохожу практический экзамен для курса по ракетке), и мне нужно сделать следующее:
Напишите функцию cached-assoc
, которая принимает список xs
и число n
и возвращает функцию, которая принимает один аргумент v
и возвращает то же самое, что (assoc v xs
) вернет.
Вы должны использовать n-элементный кеш недавних результатов, чтобы, возможно, сделать эту функцию быстрее, чем просто вызывать Assoc. Кеш должен быть вектором длины n, который создается вызовом cached-assoc и используется и, возможно, мутирует каждый раз, когда вызывается функция, возвращаемая cached-assoc.
Кеш начинается пусто (все элементы #f). Когда вызывается функция, возвращаемая cached-assoc, она сначала проверяет кеш на наличие ответа. Если его там нет, он использует assoc
и xs
, чтобы получить ответ, и если результат не #f
(то есть, у xs есть пара, которая соответствует), он добавляет пару в кеш перед возвратом
(используя векторный набор!).
Слоты кеша используются в циклическом порядке: при первом добавлении пары в кеш она помещается в позицию 0
, следующая пара - в позицию 1 и т. Д. До позиции n - 1
и затем обратно в положение 0
(заменив уже существующую пару), затем в положение 1
и т. д.
Понятия не имею, как это сделать.