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))以实现 kgen-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创建函数时传递的相同

我们刚刚实现的是一个柯里化的例子:

currying 是一种转换具有多个参数(或参数元组)的函数的技术,使其可以作为函数链调用,每个函数都有一个参数(部分应用)

如您所见,它按预期工作:

; 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 回答