我有一个类似的方案函数,它为给定的输入
生成一个哈希值 (define hash
(lambda (c)
(cond
((null? c) 600)
(else
(reduce + (map (lambda (x) (cv x)) c) (* 12 (hash (cdr c))))))))
cv(x)
是每个字母映射到数字a = 1,b = 2,c = 3 ... z = 26的位置。
600是基值。 12是一个唯一的数字。
我的问题是我做错了,我的价值观有些偏差,无法找到问题依赖的地方。
预期产出
(hash '(h i))
==> 86516
我的输出
(hash '(h i))
==> 86525
这就是我要做的事情:
600 * 12 + 9(val for i) = 7209
然后,
7209 * 12 + 8(val for h) = 86516
正如你所看到我的值有点偏离,我怀疑我是如何使用reduce函数的。
答案 0 :(得分:4)
您在reduce
内有一个递归,而reduce
是一个高级函数。 否强>
一个简单的递归就足够了:
(define hash
(lambda (c)
(if (null? c)
600
(+ (cv (car c)) (* 12 (hash (cdr c)))))))
(hash '(h i)) ; => 86516
另一方面,如果您想使用高级功能,可以使用foldr
,如:
(define hash
(lambda (c)
(foldr (lambda (x y) (+ (cv x) (* 12 y))) 600 c)))
或foldl
,如:
(define hash
(lambda (c)
(foldl (lambda (x y) (+ (cv x) (* 12 y))) 600 (reverse c))))