我想创建一个函数,该函数出现在列表中元素出现的次数。例如在列表中:'(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函数找到最高的数字。
答案 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