Recursion 计算列表中元素的出现次数

Recursion 计算列表中元素的出现次数,recursion,scheme,racket,swap,r5rs,Recursion,Scheme,Racket,Swap,R5rs,我正在编写一个名为countif的函数,它接受一个谓词p?,和一个列表ls。函数返回嵌套列表中满足p?的元素的出现次数? 例如:(count if(lambda(x)(等式?'zx))'((fx)z(((zxcvz)(y '))))将返回3。这是我写的: (define (count-if p ls) (cond ((null? ls) '()) ((p (car ls)) (+ 1 (count-if p (cdr ls)))) (else (count-if p

我正在编写一个名为countif的函数,它接受一个谓词p?,和一个列表ls。函数返回嵌套列表中满足p?的元素的出现次数? 例如:(count if(lambda(x)(等式?'zx))'((fx)z(((zxcvz)(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)))))

但我只是犯了个错误。我需要一些帮助来找到解决这个问题的更好方法。谢谢

如果,计数的签名是什么?它是:

[X] [X -> Boolean] [List-of X] -> Number
第一个
cond
子句返回什么?它返回:

'()
这是一个简单的类型错误。只需将基本大小写更改为
0
,如果
有效,则将
计数


编辑(用于嵌套)

首先,我们将日期的结构定义为嵌套的。 一个符号刚刚输入到
score
helper函数中。否则,递归调用将应用于所有嵌套的子
nested
s,并对结果进行汇总

#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

这回答了你的问题吗?我改变了,我没有得到一个错误,但我没有得到正确的号码返回。现在,我也很难从嵌套列表中获取计数。我知道我需要检查第一项是否是一个列表,但不确定之后该去哪里。嘿,我忽略了嵌套列表。补充。