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

时间:2020-02-26 00:48:52

标签: recursion scheme racket swap r5rs

我正在编写一个称为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)))))

但是我得到一个错误。我可以使用一些帮助找到解决此问题的更好方法。谢谢!

1 个答案:

答案 0 :(得分:0)

count-if的签名是什么?是:

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

第一个cond子句返回什么?它返回:

'()

这是一个简单的类型错误。只需将基本情况更改为0count-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