1

リスト((1 4 5)5(6 2 5))と別のリスト(5 1 3 7 5(9 2 4))がある場合、最初のリストの項目を比較して表示するプロシージャを作成する必要があります。彼らが2番目にいる場合。たとえば、(1 4 5)は(​​5 1 3 7 5(9 2 3))に0回出現します。5はこのリストに2回表示され、(9 2 4)は0回表示されます。したがって、リストは(0 2 0)を返します

2つのリストを取得するスキームプロシージャの頻度を作成するのに助けが必要です。1つ目は各コンポーネントを比較するもので、2つ目は最初のリストの出現回数をカウントするものです。プロシージャは、発生のリストを返す必要があります。

ありがとう!

4

2 に答える 2

2

これは明らかに宿題なので、はっきりとは答えません。代わりに、私はあなたを正しい方向に向けます。まず、問題を 2 つの手順に分割します。

  • 最初の手続き (それと呼びましょうcounter) は、要素と要素のリストを受け取ります。要素のリストをトラバースし、パラメーターとして渡された要素と等しいかどうかをそれぞれについて尋ねます。一致が見つかった場合は累積結果に 1 を追加し、そうでない場合は次の要素に進みます。null リストに到達すると、リストのトラバーサルが終了し、このためカウンターはゼロを返します。

  • 呼び出される 2 番目のプロシージャfrequencyは、質問の 2 つのリストを受け取り、最初のリスト (比較する要素のリスト) をトラバースします。これらの要素ごとに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 やインターネットの他の場所に数え切れないほどあります。少し迷ったら、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 に答える