2013-10-02 68 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 bc)將簡單地返回一個。我知道我可以使用收集類似的功能,並找出哪個數字最高。

+0

這樣的功能通常被稱爲直方圖。 –

回答

1

這已經被問過了,只是適應了@ ChrisJester-Young的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

奧斯卡...有沒有辦法讓收集類似的功能沒有得到配對?那麼在你的例子中,取而代之'((a 2)(b 3)(c 3))? –

+0

其實我從來沒有想過那真的很簡單。再次感謝! –