方案减少麻烦

时间:2017-04-24 05:23:16

标签: functional-programming scheme lisp racket

我有一个类似的方案函数,它为给定的输入

生成一个哈希值
 (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函数的。

1 个答案:

答案 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))))