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