2012-11-05 44 views
1

如果您有一个清单((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

通常我会在模板列表中

template<class t> 
class list 
{ 
    bool contains(t obj) 
    { 
    for(int i = 0; i < this->size; i++) 
     if(this->at(i) == obj) 
     return true; 
    } 
} 

我希望这将有助于你的方法解决这个问题;)

+2

您是否使用C++来回答一个计划问题,对他不做功课有微妙的挖掘? – itsbruce

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 SchemerHow to Design Programs,这两本书都会教你如何在整体上讨论递归过程。