2

リスト内の要素をカウントするための手順と、同じリストから同じ要素を削除するための手順の 2 つがあります。カウントと削除を同時に行うにはどうすればよいですか? 私は長い間それを試していますが、何も機能していません。私はこのリストを使用します: (list 1 2 3 2 1 2 3)、最終的には ((1 . 2) (2 . 3) (3 . 2)) のようになります。ペアの最初の数は要素であり、ペアの 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 (リスト 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))))))

(削除エル '2 (リスト 1 2 3 2 1 2 3)) -> (1 3 1 3)

4

1 に答える 1

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

于 2012-11-15T21:16:51.140 に答える