这显然是一个家庭作业,所以我不会给你一个直接的答案。相反,我会为您指明正确的方向。对于初学者,将问题分为两个过程:
第一个过程,我们称之为它counter
,接收一个元素和一个元素列表。它遍历元素列表,询问每个元素是否等于作为参数传递的元素。如果找到匹配项,则将累加结果加一,否则继续下一个元素。当到达空列表时,列表遍历结束,为此计数器返回零。
第二个过程被称为frequency
接收问题中的两个列表并遍历第一个列表(要比较的元素列表)。对于这些元素中的每一个,它都会调用counter
以找出结果,并在此过程中建立一个列表。
这是解决方案的一般结构,您必须填写空白:
(define (counter ele lst)
(cond ((null? lst)
<???>)
((equal? ele <???>)
(<???> (counter ele <???>)))
(else
(counter ele <???>))))
(define (frequency els lst)
(if (null? els)
<???>
(cons <???>
(frequency <???> lst))))
请注意,counter
我假设正在列表中的基本级别搜索元素,例如这将找不到元素:
(counter 5 '((5)))
=> 0
如果您必须找到像上面示例中的匹配项,那么问题会更有趣 - 您需要以树状方式递归遍历列表列表。在 Stack Overflow 或 Internet 的其他地方有无数这样的例子;如果你觉得有点迷茫,我建议你看看The Little Schemer或How to Design Programs,这两本书都会教你如何理解递归过程。