1

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

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

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

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

我正在尝试编写的下一个函数查找列表中最常见的元素。例如,在列表 '(aaaaabc) 上运行函数将简单地返回 a。我知道我可以使用 collect-similar 功能并找到最高的数字。

4

1 回答 1

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
于 2013-10-02T01:01:25.330 回答