如果您有一个列表((1 4 5)5(6 2 5))和另一个列表(5 1 3 7 5(9 2 4)),我需要编写一个比较第一个项目的程序列表,看看他们是否在第二个。例如,(1 4 5)在(5 1 3 7 5(9 2 3))中出现0次。 5在此列表中出现2次,并且(9 2 4)出现0次。所以列表将返回(0 2 0)
我需要帮助编写一个带有两个列表的方案程序频率,第一个是每个组件进行比较的列表,第二个是计算第一个列表出现次数的列表。该过程应返回事件列表。
谢谢!
答案 0 :(得分:2)
这显然是一项功课,所以我不会直截了当地回答你。相反,我会指出你正确的方向。对于初学者,请在两个过程中分解问题:
第一个程序,我们称之为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,这两本书都会教你如何理解递归过程。
答案 1 :(得分:0)
通常我会用模板列表中的方法解决这个问题
template<class t>
class list
{
bool contains( t obj )
{
for( int i = 0; i < this->size; i++ )
if( this->at(i) == obj )
return true;
}
}
我希望这会对你有帮助;)