我正在编写一个称为count-if的函数,该函数接受一个谓词p?和一个列表ls。该函数返回嵌套列表中满足p?的元素的出现次数。 例如:(count-if(lambda(x)(eq?'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)))))
但是我得到一个错误。我可以使用一些帮助找到解决此问题的更好方法。谢谢!
答案 0 :(得分:0)
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