2012-11-15 36 views
2

删除元素我有两个方法,一个用于计算列表中的一个元素,另一个来自同一列表中删除相同的元素。我应该怎么做才能同时计数和清除?我试了很久,但没有任何工作。我使用这个列表:(列表1 2 3 2 1 2 3),最后应该是:((1。2)(2。3)(3。2))。第一对数是一个元素,第二对数是所有列表中第一对数的总和。 我尝试: 1)它仅适用于计数,结果是:((1 2)(2 3)(3 2)(2 2)(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(表1 2 3 2 1 2 3)) - >(1 3 1 3)

回答

1

只返回一次计数和所述移除列表。我把这个例程称为 count-remove。 (赦免不地道或高效的作风所有的阴谋家)

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

+0

谢谢。这对我来说有点复杂,因为我只是初学者,但它正在工作。我应该更加努力地学习Scheme。 – Ats

相关问题