方案收集列表中的类似项目并查找列表中最常见的项目

时间:2013-10-02 00:25:48

标签: scheme

我想创建一个函数,该函数出现在列表中元素出现的次数。例如在列表中:'(a b c b b c c a)我希望它返回一个嵌套列表: '((a 2)(b 3)(c 3))

我知道这个函数看起来像这样:

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

我知道我需要继续检查列表,直到它返回到空列表的基本情况,我可以使用cadr检查列表的其余部分。但我不太确定如何获取值以及如何使其返回嵌套列表。

我正在尝试编写的下一个函数找到列表中最常见的元素。例如,在列表'(a a a a a b b)上运行该函数将只返回a。我知道我可以利用collect-similar函数找到最高的数字。

1 个答案:

答案 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