2

我有两个过程,一个用于计算列表中的元素,另一个用于从同一列表中删除相同的元素。同时计数和删除应该怎么做?我尝试了很长时间,但没有任何效果。我使用这个列表:(list 1 2 3 2 1 2 3),最后它应该是这样的:((1 . 2) (2 . 3) (3 . 2))。第一个对数是一个元素,第二个对数是所有列表中第一对数的总和。我的尝试:1) 它只适用于计数,结果是: ((1 . 2) (2 . 3) (3 . 2) (2 . 2) (1 . 1) (2 . 1) (3 . 1) ) 2) 它仅适用于删除,结果是: ((1 . 2) 2 3 2 2 3)

哪里有问题?

这是为了计数:

(define count-occurrences
  (lambda (x ls)
    (cond
      [(memq x ls) =>
       (lambda (ls)
         (+ (count-occurrences x (cdr ls)) 1))]
      [else 0])))

(出现次数 '2(列表 1 2 3 2 1 2 3))-> 3

这是为了删除:

(define (remove-el p s)
  (cond ((null? s) '())
        ((equal? p (car s)) (remove-el p (cdr s)))
        (else (cons (car s) (remove-el p (cdr s))))))

(删除-el '2 (list 1 2 3 2 1 2 3)) -> (1 3 1 3)

4

1 回答 1

1

只需一次返回计数和删除的列表。我将此例程称为计数删除。(请原谅所有不惯用或高效风格的策划者)

(define (count-remove ls x)
  (letrec ([loop (lambda (count l removed)
                   (cond
                     [(eq? l '()) (list count removed)]
                     [(eq? (car l) x) (loop (+ 1 count) (cdr l) removed)]
                     [else (loop count (cdr l) (cons (car l) removed))]))])
    (loop 0 ls '())))

(define (count-map ls)
  (cond
    [(eq? ls '()) '()]
    [else
       (letrec ([elem (car ls)]
                [cr (count-remove ls elem)])
         (cons (cons elem (car cr)) (count-map (cadr cr))))]))                   

下面是一些用法:

(count-map '(1 1 2 3 2))
((1 . 2) (2 . 2) (3 . 1))

于 2012-11-15T21:16:51.140 回答