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

时间:2012-11-15 20:23:22

标签: scheme

我有两个程序,一个用于计算列表中的元素,另一个用于从同一列表中删除相同的元素。我应该怎么做才能同时计算和删除?我正在尝试很长时间,但没有任何工作。我使用这个列表:(列表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])))

(count-occurrences'2(list 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))))))

(remove-el'2(list 1 2 3 2 1 2 3)) - > (1 3 1 3)

1 个答案:

答案 0 :(得分: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))