2011-11-11 5 views
1
でキャッシュされた機能

を書く:は、だから私は(ラケットのコースのための模擬試験の上に行く)いくつかのコードに取り組んでいる、と私は次のことを行う必要がありラケット

リストを取る関数cached-assocを書きますxsと数値nを返し、1つの引数vをとり、(assoc v xs)と同じものを返す関数を返します。

最近の結果のn要素キャッシュを使用して、おそらくassocを呼び出すよりも速くこの関数を実行する必要があります。キャッシュは、cached-assocの呼び出しによって作成され、cached-assocによって返された関数が呼び出されるたびに使用され、おそらくは変更された長さnのベクトルでなければなりません。

キャッシュは空になります(すべての要素#f)。 cached-assocから返された関数が呼び出されると、最初にキャッシュがその答えをチェックします。存在しない場合は、assocxsを使用して答えを返し、結果が#fでない場合(xsに一致するペアがある場合)、 を返す前にペアをキャッシュに追加します(ベクターセットを使用してください)。 。次いで、一対のは、それが位置0に置かれ、キャッシュに追加された最初の時間は、次の対が位置n - 1まで等の位置1に入れて:

キャッシュスロットがラウンドロビン方式で使用されています0に戻って(既にそこにあるペアを置き換えて)、1などの位置に戻します。

これを行う方法はわかりません。

+0

あなたは特に何について考えていませんか?または、おそらく、あなたは何をするのか考えているでしょうか?確かに、あなたは_何かを知っていなければなりません。そうでなければ、あなたはもっと大きな問題を抱えています。 –

答えて

4

質問にはいくつかのことが必要です。一部のリストは次のとおりです。

  1. 内部の非グローバルな状態の関数を作成する方法。
  2. ベクトル内のアイテムを検索できる関数を定義する方法。
  3. 別のもののラッパーとして機能する関数を作成する方法。
  4. know what assocがあります。
  5. ベクターを突然変異させる方法。
  6. ローカル変数を変更する方法。

クイズの質問として、実際にはいくつかの概念を一度に実行しています。これらの概念が寒くなくても、難しいことが起こります。

これらのいずれかで問題があるのですか、それともあなたが詰まっている何か他にありますか?

2

これは私の実装です。この問題にどう対処するかをあなたに伝えるだけです。私はおそらく宿題の提出に合格しない方法でそれを書いた(私はそれがあなたの意図であると推測しているわけではない)。 :-)

(define (cached-assoc xs n) 
    (define cache (make-vector n #f)) 
    (define index 0) 
    (define (fetch-cache k i) 
    (if (or (negative? i) (< i (- index n))) #f 
     (let ((cur (vector-ref cache (modulo i n)))) 
      (if (equal? (car cur) k) cur 
       (fetch-cache k (sub1 i)))))) 
    (define (update-cache val) 
    (vector-set! cache (modulo index n) val) 
    (set! index (add1 index)) 
    val) 
    (lambda (k) 
    (cond ((fetch-cache k (sub1 index))) 
      ((assoc k xs) => update-cache) 
      (else #f)))) 
関連する問題

 関連する問題