Ну есть несколько вещей, которые мы можем быстро понять, первое, что вы будете нуждаться в рекурсию через исходный список, а второй является то, что вам вам нужно будет сохранить список аккумуляторов и каким-то образом иметь представление о том, какой элемент первого списка вы просматриваете, поэтому мы также можем добавить счетчик.
Так,
; listsearch : (listof Any) Any -> (listof Int)
; Searches a list for val and returns a list of indexes for occurrences of val in lst
; (listsearch '(1 2 1 3 4 1) 1) => '(0 2 5)
(define (listsearch lst val)
(local [(define (helper lst acc counter)
(cond [(empty? lst) acc]
[(equal? val (first lst)) (helper (rest lst)
(cons counter acc)
(add1 counter))]
[else (helper (rest lst) acc (add1 counter))]))]
(reverse (helper lst empty 0))))
Я добавил местный, потому что счетчик должен присутствовать, но мы хотим, чтобы фактическая функция быть аккуратным, так что вызов просто требует список и значение.
Это просто просматривает список по одному, и делает три проверки
- ли список пуст? Верните мой накопленный список (база пуста)
- Является первым в списке моим значением? Начните снова, но добавьте это значение в мой аккумулятор и добавьте его к моему счетчику.
- Это первый элемент в списке что-то еще? Начните снова, но добавьте один к моему счетчику
Это приводит к обратному списку, поэтому мы отменяем его в конце.
Вот и все! :)
Вам необходимо включить код, который вы уже пробовали, и каким был результат (например, произошла ошибка (включите его), результат отличается от ожидаемого (включая его) и т. Д.). – Michelle