2013-10-02 2 views
1

Я хочу создать функцию, которая вызывает количество раз, когда элемент появляется в списке. Например, в списке: '(abcbbcca) Я хочу, чтобы он вернул вложенный список: ' ((a 2) (b 3) (c 3))Схема сбора похожих элементов в списке и поиск наиболее употребимого элемента в списке

Я знаю, что функция будет выглядеть примерно так: :

(define collect-similar 
(lambda (elm ls) 
    (cond 
    [(null? ls) '()] 
    [(equal? elm (car ls))] 

Я знаю, что мне нужно, чтобы продолжить проверку по списку, пока он не прибудет обратно в базовом случае списка нулевой, и я могу проверить остальную часть списка с помощью CADR. Но я не слишком уверен в том, как получить значение и как вернуть его вложенный список.

Следующая функция, которую я пытаюсь написать, находит наиболее распространенный элемент в списке. Например, запуск функции в списке '(a a a a b c) просто вернет a. Я знаю, что могу использовать подобную коллекцию функцию и найти, какой номер является самым высоким.

+0

функция, как это обычно называется гистограммой. –

ответ

1

Это было задано прежде, просто приспособите одну из реализаций @ ChrisJester-Young's bagify. Например:

(define (collect-similar lst) ; a slightly modified `bagify` 
    (hash->list 
    (foldl (lambda (key ht)    
      (hash-update ht key add1 0)) 
      '#hash() 
      lst))) 

(collect-similar '(a b c b b c c a)) 
=> '((a . 2) (b . 3) (c . 3)) 

С collect-similar на месте, это просто, чтобы найти наиболее общий элемент:

(define (most-common lst) 
    (let loop ((alst (collect-similar lst)) ; use previous procedure 
      (maxv '(#f . -inf.0))) 
    (cond ((null? alst) (car maxv)) 
      ((> (cdar alst) (cdr maxv)) 
      (loop (cdr alst) (car alst))) 
      (else 
      (loop (cdr alst) maxv))))) 

(most-common '(a a a a a b c)) 
=> 'a 
+0

+1 для крика. ; -D –

+0

Оскар ... есть способ сделать подобную коллекцию функцию без получения пар? Поэтому вместо этого в вашем примере get '((a 2) (b 3) (c 3))? –

+0

На самом деле, я так и не понял, что было очень просто. Еще раз спасибо! –

Смежные вопросы