计算Scheme中列表中的数字或字符

时间:2012-12-05 12:36:34

标签: list lisp scheme counting

有没有人知道如何计算列表中的所有数字或字符并以这种格式成对打印:( number.number_of_occurrences)。例如:

  

(计数'(3 1 3 2 1 2 3 3 3))

     

((3.5)(1.2)(2.2))

     

(计数'(d b a c b b))

     

((d.1)(b.3)(a.2)(c.1))

先谢谢你帮助我:)。

2 个答案:

答案 0 :(得分:2)

这是一个想法 - 使用哈希表来跟踪出现的次数。这是一个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)))))))

或者,这里是一个更简单的版本(它不使用filter)@ mobyte在Scheme中的解决方案 - 注意到它是O(n^2),因此效率低于基于散列表的过程:< / p>

(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))

答案 1 :(得分:0)

这是clojure的解决方案。但我希望它会有所帮助:

(defn counter [l]
  (map (fn [e]
         [e (count (filter #{e} l))])
       (distinct l)))

(counter [3 1 3 2 1 2 3 3 3])
-> ([3 5] [1 2] [2 2])

(counter '(d b a c b b a))
-> ([d 1] [b 3] [a 2] [c 1])