Как я могу подсчитать вхождения элемента в списке и создать новый список?

#scheme #racket

#схема #ракетка

Вопрос:

как я могу изменить, (count-fruit ’(apple banana banana orange peach)) чтобы '((apple 1) (banana 2) (orange 1) (grape 0)
(peach 1)))
отметить, что виноград также является существующим видом фруктов, поэтому мы не можем исключить его из списка

Комментарии:

1. Что вы пробовали? Каковы ваши идеи о том, как это решить? Никто не покажет вам код, если вы этого не сделаете, но я мог бы написать идеи, если вы отредактируете вопрос, указав, где вы застряли.

2. Как вы получили там виноград? Вы пытаетесь реализовать функцию, которая будет принимать 2 списка (список существующих фруктов и список фруктов для подсчета)? Вы говорите, что «виноград также является существующим видом фруктов», как у нас есть способ определить, является ли что-то (или не является) фруктом?

3. А где Личи и Манго?

4. Сначала напишите функцию, которая вычисляет, сколько раз один символ появляется в списке. (Я подозреваю, что вы написали что-то очень похожее совсем недавно.) Подумайте о том, как вы можете использовать эту функцию. (Подсказка: map это ваш друг.)

5. @Сильвестр и арбуз. Я люблю арбуз. ^.^

Ответ №1:

Прежде всего рассмотрим

 (map (lambda (x) (cons x 0)) '(apple banana banana orange peach))
  

это приведет к

 ((apple . 0) (banana . 0) (banana . 0) (orange . 0) (peach . 0))
  

затем вы можете использовать счетчик, чтобы увеличить число.

 (let ((counter 0))
  (lambda (x)
    ;; you need to store the result (cons x counter)
    ;; in a temporary variable using LET here
    ;; then use SET! to increment counter
    ;; then return the temp
    ))
  

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