我创建了这个方法,给定一个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))
到目前为止,我没有得到任何输出。
答案 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)
时精神上跟踪您的计划正在执行的操作:
'((a b c) b)
是否为null?
。事实并非如此,所以我们转移到下一个分支。'b
是否是(car '((a b c) b)
的成员,即'(a b c)
。它是,所以我们执行这个分支的结果。list
的{{1}}一起递归,即(cdr '((a b c) b)
。'(b)
。您正确传递literal
未更改,并递增count
。'(b)
是否为null?
。事实并非如此,所以我们转移到下一个分支。'b
是否是(car '(b)
的成员,即'b
。 'b
不是列表,因此member
会抛出错误。