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

时间:2016-10-10 06:18:52

标签: scheme racket

我创建了这个方法,给定一个Scheme s-expression,它应该返回equal?literal的子表达式的数量 - 例如(count '((a b c) b) 'b)应该返回2。 / p>

(define (count list literal)
    (define (count-under list literal count)
        (cond
            [(null? list) count]
            [(member literal (car list)) (count-under (cdr list) literal (+ count 1))]))
    (count-under list literal 0))

到目前为止,我没有得到任何输出。

1 个答案:

答案 0 :(得分:0)

当我尝试使用您建议的(count '((a b c) b) 'b)定义评估count时,DrRacket会显示错误消息

member: not a proper list: 'b

所以我绝对从你到目前为止写的输出。但是,正如Racket所指出的那样,您的代码会尝试执行member - 检查不是列表的内容。

要了解原因,请在list'((a b c) b)literal'b)时精神上跟踪您的计划正在执行的操作:

  1. 检查'((a b c) b)是否为null?。事实并非如此,所以我们转移到下一个分支。
  2. 检查'b是否是(car '((a b c) b)的成员,即'(a b c)。它是,所以我们执行这个分支的结果。
  3. list的{​​{1}}一起递归,即(cdr '((a b c) b)'(b)。您正确传递literal未更改,并递增count
  4. 检查'(b)是否为null?。事实并非如此,所以我们转移到下一个分支。
  5. 检查'b是否是(car '(b)的成员,即'b'b不是列表,因此member会抛出错误。