比较列表中的项目?

时间:2012-11-05 13:35:51

标签: scheme mit-scheme

如果您有一个列表((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)

我需要帮助编写一个带有两个列表的方案程序频率,第一个是每个组件进行比较的列表,第二个是计算第一个列表出现次数的列表。该过程应返回事件列表。

谢谢!

2 个答案:

答案 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 SchemerHow 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;
   } 
}

我希望这会对你有帮助;)