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)

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

谢谢!

4

2 回答 2

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,这两本书都会教你如何理解递归过程。

于 2012-11-05T14:19:57.137 回答
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;
   } 
}

我希望这能帮到您 ;)

于 2012-11-05T13:43:39.967 回答