Список ракеток Questio - PullRequest
       10

Список ракеток Questio

0 голосов
/ 08 июня 2018

Кто-нибудь знает, как вернуть количество определенных элементов в списке?

Пример: дано

(list 'a 'a 'a 'a 'a 'b 'b 'b)

Возвращает числа 'a: 5

номера 'b: 3

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Мне несколько удалось найти ответ, поэтому вот определение функции:

(define (number-of s L)
  (cond
    [(empty? L) 0]
    [else (cond [(eq? s (first L)) (+ 1 (number-of s (rest L)))]
                [else (number-of s (rest L))])]))
0 голосов
/ 09 июня 2018

Вы их считаете.Вы создаете процедуру, которая берет список и то, что вы хотите найти, и итерируете этот список, сохраняя счет, и когда вы достигаете конца, вы возвращаете это значение.

Скелет для простого рекурсивного решения:

(define (count-element element lst)
  (define (helper lst count)
    (cond ((empty? lst) count)
          ((equal? element <first element>) <recurse whith cdr and increasing count>)
          (else <recurse with cdr>)))
  (helper lst 0))

Или вы можете использовать foldl

(define (count-element element lst)
  (foldl (lambda (e count)
           (if <e is the same as element>
               <return 1 more than count>
               <return count>))
         0
         lst))

Возможно, есть еще 10 способов сделать это,но первый - самый познавательный, а второй - самый распространенный способ, которым я бы это сделал.Некоторые тесты:

(define test '(a a a a a b b b))

(count-element 'b '()) ; ==> 0
(count-element 'e test) ; ==> 0 
(count-element 'a test) ; ==> 5
(count-element 'b test) ; ==> 3
...