是否有人知道如何计算列表中的所有数字或字符,并按以下格式成对打印:(数字)出现次数)例如:
(计数'(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/

10-16 16:08