Scheme Helper函数并始终返回零

时间:2014-11-15 21:57:00

标签: hash functional-programming scheme helper

我正在尝试编写一个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))))

2 个答案:

答案 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是更好的库函数选择?