Сверните список, начиная с пустого списка в качестве аккумулятора.Для каждого элемента проверьте: если аккумулятор пуст, добавьте элемент (неявное число 1).Если на передней панели аккумулятора есть один элемент, который соответствует этому, замените его счетом 2 для этого элемента.Если на передней панели аккумулятора есть пара, соответствующая этой, увеличьте ее счет на единицу.В противном случае добавьте элемент (неявное число 1).
(define (count-occurrences lat)
; Get the results in the order of the input list
(reverse
(fold (lambda (item acc)
(cond
; Start off by counting the first item
((null? acc)
(cons item acc))
; If the previous item was this one, set its count to 2
((and (atom? (car acc))
(eqv? item (car acc)))
(cons (list 2 item)
(cdr acc)))
; If there has been a run of this item, increment the count by 1
((and (pair? (car acc))
(eqv? item (cadar acc)))
(cons (list (+ 1 (caar acc)) item)
(cdr acc)))
; The previous item was not this one, so start counting this one now
(else
(cons item acc))))
'()
lat)))
Для функции fold
часто требуется srfi-1
.