我正在尝试编写一个Scheme函数,该函数接收一个字母列表,用另一个函数对它们进行哈希处理,将每个函数迭代地乘以5 ^ i,然后将它们相加。我是Scheme的新手,这就是我写的:
(define (key w)
keyhelper w 0)
(define (keyhelper w i)
(cond ((null? w) '())
(else (+ (* (hashchar(car w) (expt 5 i)) (keyhelper(cdr w) (+ i 1)))))))
例如,做(key'(hello))应该做hashchar(h)* 5 ^ 0 + hashchar(e)* 5 ^ 1 + hashchar(l)^ 5 ^ 2 ...等该函数仅对任何发送的列表返回0.有人可以告诉我哪里出错了吗?
我对hashchar的实现是:
(define hashchar
(lambda (x)
(cond
((eq? x 'a) 1)
((eq? x 'b) 2)
((eq? x 'c) 3)
((eq? x 'd) 4)
((eq? x 'e) 5)
((eq? x 'f) 6)
((eq? x 'g) 7)
((eq? x 'h) 8)
((eq? x 'i) 9)
((eq? x 'j) 10)
((eq? x 'k) 11)
((eq? x 'l) 12)
((eq? x 'm) 13)
((eq? x 'n) 14)
((eq? x 'o) 15)
((eq? x 'p) 16)
((eq? x 'q) 17)
((eq? x 'r) 18)
((eq? x 's) 19)
((eq? x 't) 20)
((eq? x 'u) 21)
((eq? x 'v) 22)
((eq? x 'w) 23)
((eq? x 'x) 24)
((eq? x 'y) 25)
((eq? x 'z) 26))))
答案 0 :(得分:2)
key
始终返回零,因为您以这种方式定义它。你有:
(define (key w)
keyhelper
w
0)
因此,它评估keyhelper
(丢弃其值),然后w
(丢弃其值),然后0
(返回其值)。所以答案永远是0。
您应该这样定义:
(define (key w)
(keyhelper w 0))
注意额外的括号。
此外,keyhelper
的基本情况值是错误的。它不应该是'()
,应该是i
。
答案 1 :(得分:0)
如果您对hashchar
的定义与this one类似:
(define (hash:hash-char-ci char n)
(modulo (char->integer (char-downcase char)) n))
(define hash:hash-char hash:hash-char-ci)
当hashchar
传递给i = 0
时,(expt 5 i)
将返回0,因为(expt 5 i)
为1,任何整数的单模数为零。
一旦你将零乘以哈希函数,那么你总是会得到零...因为+
除了返回身份之外没有做任何事情,因为它只传递了一个参数:
(* (hashchar(car w) (expt 5 i)) (keyhelper(cdr w) (+ i 1)))
也许string-hash
是更好的库函数选择?