3

まず始めに、私はスキームの初心者です。また、これはハードウェアに基づいているため、答えを探しているのではなく、ここで何が起こっているのかについての説明を求めています。ここに行きます:

だから私は実装する必要がある機能を持っています。

(define gen-hash-division-method
  (lambda (size)
    ...
  ))

既に実装した別の関数は、キーとして定義され、単語をパラメーターとして取り、何らかの値を計算します。正しいので載せませんが例としてkey('(w o r d)) => 130293。現在、「gen-hash-division-method」が行うことになっているのは、パラメーターに基づいてキーのモジュラスを取得することだけです。つまり、h(k) = k modulus size

問題は、k がパラメーターとして指定されていない場合、どのように計算するかということです。これは、「gen-hash-division-method」の使用方法です。

(define hash-1 (gen-hash-division-method 701))

701はサイズパラメータだと思います。テストするには、次のようにします。

(hash-1 '(h e l l o))

これは私が混乱しているところです。ここで何をしているのかわかりません。key('(h e l l o))単語はそこに与えられていますが、k を実装するために呼び出す方法がわかりませんgen-hash-division-method(size) => k modulus size

4

1 に答える 1

2

どれどれ。gen-hash-division-methodパラメータに基づいてキーのモジュラスを返しますが、キーsizeを作成する文字は後で別のパラメータとして渡されます。つまり、次のようになります。

(define gen-hash-division-method
  (lambda (size)
    (lambda (chars)
      (modulo (key chars) size))))

これが起こっていることです:

  • gen-hash-division-methodサイズを指定すると、サイズを法とするキーの計算に特化した別の関数を返す関数です。
  • 返された関数は、パラメータとして文字のリストを受け取ります
  • 文字のリストが渡されると、プロシージャを使用してキーが計算され、その後関数を作成するときに渡されkeyた同じものを常に使用してモジュロ演算が実行されます。size

今実装したのはカリー化の例です:

カリー化とは、複数の引数 (または引数のタプル) を取る関数を、それぞれが 1 つの引数を持つ一連の関数として呼び出せるように変換する手法です (部分適用)。

ご覧のとおり、期待どおりに動作します。

; hash-1 calculates hashes modulo 701
(define hash-1 (gen-hash-division-method 701)) 

; in particular, here we find the hash modulo 701 for '(h e l l o)
(hash-1 '(h e l l o))

; any other list of chars we pass will be hashed modulo 701
(hash-1 '(f o o))
于 2013-04-16T13:46:41.090 に答える