Выполнить кодирование длины символов в списке с использованием языка схем - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь найти частоту букв в списке с использованием языка схем, но я не могу сделать это в течение 4 дней, и код должен работать в repl.it

Например, наш список

 (a a a a b c c a a d e e e e)

наш результат должен быть

(4 a) b (2 c) (2 a) d (4 e)

Спасибо всем ...

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

У меня есть код, который также может работать на 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)))))))))
0 голосов
/ 04 декабря 2018

Сверните список, начиная с пустого списка в качестве аккумулятора.Для каждого элемента проверьте: если аккумулятор пуст, добавьте элемент (неявное число 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.

...