【问题标题】:Counting number of occurrences of elements in a list计算列表中元素的出现次数
【发布时间】:2020-06-09 19:35:05
【问题描述】:

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

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

【问题讨论】:

标签: recursion scheme racket swap r5rs


【解决方案1】:

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

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

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

'()

这是一个简单的类型错误。只需将基本情况更改为 0count-if 即可。


编辑(用于嵌套)。

首先我们将日期的结构定义为Nested。 一个符号被输入到score 辅助函数中。否则递归调用将应用于所有嵌套的 sub-nesteds,并将结果相加。

#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

【讨论】:

  • 我改变了它,我没有收到错误,但我没有得到正确的号码返回。现在我在从嵌套列表中获取计数时也遇到了一些麻烦。我知道我需要检查第一项是否是列表,但不知道接下来该去哪里。
  • 嘿,我忽略了嵌套列表。已添加。
猜你喜欢
  • 2011-08-10
  • 1970-01-01
  • 2018-11-20
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多