Частота символов в списке с использованием языка схем
Я пытаюсь найти частоту букв в списке с использованием языка схем, но я не могу сделать это в течение 4 дней, и код должен работать в repl.it
Например, наш список
(a a a b b c c c c a a a)
наш вывод должен быть
4a 2b 4c 3a
Спасибо всем...
0 ответов
У меня есть код, который также может работать на repl.it
(define (countW list1)
(if (null? list1)
'()
(let ((reserv (list 1)))
(let loop ((source reserv)
(elter (car list1))
(counter 1)
(list1 (cdr list1)))
(if (and (not (null? list1))
(equal? elter (car list1)))
(loop source elter (+ counter 1) (cdr list1))
(begin
(set-cdr! source (list (if (= 1 counter) elter (list elter counter))))
(if (null? list1)
(cdr reserv)
(loop (cdr source) (car list1) 1 (cdr list1)))))))))
Сверните список, начиная с пустого списка в качестве аккумулятора. Для каждого элемента проверьте: если аккумулятор пуст, добавьте элемент (неявное число 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
,