Я хотел бы попросить вас помочь с моей задачей, которую я пытаюсь решить.Функция должна работать так.Входные данные - это подсписок ((1 10 250) (1 10 250) (250 10 250) (1 10 255)))
, а выходные данные должны быть ((1 . 3) (10 . 4) (250 . 4) (255 . 1))
, поэтому на самом деле это вывод гистограммы в текстовом формате.
Я использую этот код с реализацией функции flatten
, которая составляет из подсписков один список.Но это подсчет количества подсписков, а не каждого элемента подсписка.
(define (run-length-encode lst )
(define (rle val-lst cur-val cur-cnt acc)
(if (pair? val-lst)
(let ((new-val (car val-lst)))
(if (eq? new-val cur-val)
(rle (cdr val-lst) cur-val (+ cur-cnt 1) acc)
(rle (cdr val-lst) new-val 1 (cons (cons cur-cnt cur-val) acc))))
(cons (cons cur-cnt cur-val) acc)))
(if (pair? lst)
(reverse (rle (cdr lst) (car lst) 1 '()))
'()))
Функция выравнивания:
(define (flatten lst)
(if (not (list? lst))
(list lst)
(apply append (map flatten lst))))
Вывод:
> (run-length-encode '((1 10 250) (1 10 250) (250 10 250) (1 10 255)))
(250 10 1 1 250 10 1 1 250 10 250 1 255 10 1 1)
Спасибо за помощь в этом.Jan