これは明らかに宿題なので、はっきりとは答えません。代わりに、私はあなたを正しい方向に向けます。まず、問題を 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 SchemerかHow to Design Programsのどちらかを読むことをお勧めします。どちらの本も、再帰プロセス全般を理解する方法を教えてくれます。