如何在Scheme中的列表中同时计数和删除元素

如何在Scheme中的列表中同时计数和删除元素,scheme,Scheme,我有两个过程,一个用于计算列表中的元素,另一个用于从同一列表中删除同一元素。我应该如何同时计数和删除?我尝试了很长时间,但没有任何效果。我使用这个列表:(列表123123),最后应该是这样的:((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) 问题在哪里 这是用来计数的: (de

我有两个过程,一个用于计算列表中的元素,另一个用于从同一列表中删除同一元素。我应该如何同时计数和删除?我尝试了很长时间,但没有任何效果。我使用这个列表:(列表123123),最后应该是这样的:((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)

问题在哪里

这是用来计数的:

(define count-occurrences
  (lambda (x ls)
    (cond
      [(memq x ls) =>
       (lambda (ls)
         (+ (count-occurrences x (cdr ls)) 1))]
      [else 0])))
(计数出现次数'2(列表123))->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(列表1 2 2 1 2 3))->(1 3 1 3)

立即返回计数和删除的列表即可。我称之为例行公事 计数删除。(请原谅所有不惯用或效率不高的策划人)

以下是一些用法:


(计数图’(1 1 2 3 2))
((1 . 2) (2 . 2) (3 . 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))))]))