количество элементов в схеме нескольких подсписков - PullRequest
0 голосов
/ 26 декабря 2018

Я хотел бы попросить вас помочь с моей задачей, которую я пытаюсь решить.Функция должна работать так.Входные данные - это подсписок ((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

1 Ответ

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

В Racket есть встроенная процедура flatten, ее не нужно переписывать.В сочетании со старым добрым bagify мы можем решить проблему, используя простую композицию процедур - вам следует избегать попыток сделать все за одну процедуру, это может сбить с толку:

#lang racket

(define (bagify lst)
  (foldl (lambda (key ht)
           (hash-update ht key add1 0))
         #hash() lst))

(define (run-length-encode lst)
  (hash->list
   (bagify (flatten lst))))

Работает как положено:

(run-length-encode '((1 10 250) (1 10 250) (250 10 250) (1 10 255)))
=> '((1 . 3) (250 . 4) (10 . 4) (255 . 1))
...