是否有人知道如何计算列表中的所有数字或字符,并按以下格式成对打印:(数字)出现次数)例如:
(计数'(3 1 3 2 1 2 3 3 3 3))
((35)(12)(2(二)
(计数'(d b a c b a))
((d1)(乙3)(甲2)(c(一)
提前谢谢你帮我:)
最佳答案
这里有一个想法-使用哈希表来跟踪出现的次数这是一个O(n)
过程:
(define (counter lst)
(let ((counts (make-hash)))
(let loop ((lst lst))
(cond ((null? lst)
(hash->list counts))
(else
(hash-update! counts (car lst) add1
(lambda () 0))
(loop (cdr lst)))))))
或者,这里是Scheme中@mobyte解决方案的更简单版本(它不使用
filter
),注意这是O(n^2)
,因此比基于哈希表的过程效率更低:(define (counter lst)
(map (lambda (e)
(cons e (count (curry equal? e) lst)))
(remove-duplicates lst)))
无论哪种方式,它都按预期工作:
(counter '(3 1 3 2 1 2 3 3 3))
=> '((3 . 5) (2 . 2) (1 . 2))
(counter '(d b a c b b a))
=> '((b . 3) (a . 2) (d . 1) (c . 1))
关于list - 计算方案列表中的数字或字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13723402/