Подсчет количества появлений элементов в списке - PullRequest
0 голосов
/ 26 февраля 2020

Я пишу функцию count-if, которая принимает предикат p? И список ls. Функция возвращает количество вхождений элементов во вложенном списке, которые удовлетворяют p? Например: (count-if (lambda (x) (eq? 'Zx))' ((fx) z (((zx c vz) (y))))) вернет 3. Это то, что у меня есть написано:

(define (count-if p ls) (cond
  ((null? ls) '())
  ((p (car ls))
    (+ 1 (count-if p (cdr ls))))
  (else
    (count-if p (cdr ls)))))

Но я просто получаю сообщение об ошибке. Я мог бы использовать некоторую помощь, чтобы найти лучший способ go об этой проблеме. Спасибо!

1 Ответ

0 голосов
/ 26 февраля 2020

Что такое подпись count-if? Это:

[X] [X -> Boolean] [List-of X] -> Number

Что возвращает первое предложение cond? Возвращает:

'()

Это ошибка простого типа. Просто измените базовый случай на 0 и count-if работает.


Редактируйте (для вложенных).

Сначала мы определим структуру даты как Nested. Символ только что подается в вспомогательную функцию score. В противном случае рекурсивный вызов применяется ко всем вложенным под nested с, и результаты суммируются.

#lang racket

; Nested is one of:
; - Number
; - [List-of Nested]

; Nested -> Number
(define (count-if pred inp)
  ; Symbol -> Number
  (define (score n) (if (pred n) 1 0))
  ; Nested -> Number
  (define (count-if-h inp)
    (if (symbol? inp)
        (score inp)
        (apply + (map count-if-h inp))))
  (count-if-h inp))


(count-if (lambda (x) (eq? 'z x)) '((f x) z (((z x c v z) (y)))))
; => 3
...