2017-04-24 3 views
0

J'ai une fonction de système comme de sorte que génère une valeur de hachage pour une entréeScheme réduire la difficulté

(define hash 
    (lambda (c) 
    (cond 
    ((null? c) 600) 
    (else 
     (reduce + (map (lambda (x) (cv x)) c) (* 12 (hash (cdr c)))))))) 

cv(x) donné est où chaque cartes de lettre à un certain nombre a = 1, b = 2, c = 3. .. z = 26.

600 est la valeur de base. 12 est un nombre unique. Mon problème est que je fais quelque chose de mal que mes valeurs sont un peu hors et ne peuvent pas trouver où le problème repose.

attendu Sortie

(hash '(h i)) 
==> 86516 

Ma sortie

(hash '(h i)) 
==> 86525 

C'est ce que je suis en train de faire:

600 * 12 + 9(val for i) = 7209 

puis,

7209 * 12 + 8(val for h) = 86516 

Comme vous pouvez le voir, mes valeurs sont un peu faussées, je soupçonne que j'utilise la fonction de réduction.

Répondre

4

Vous avez une récursivité à l'intérieur de reduce, tandis que reduce est une fonction de haut niveau. n °.

Un récursivité simple, suffit:

(define hash 
    (lambda (c) 
    (if (null? c) 
     600 
     (+ (cv (car c)) (* 12 (hash (cdr c))))))) 

(hash '(h i)) ; => 86516 

Si, d'autre part, vous voulez utiliser une fonction de haut niveau, vous pouvez utiliser soit foldr, comme dans:

(define hash 
    (lambda (c) 
    (foldr (lambda (x y) (+ (cv x) (* 12 y))) 600 c))) 

ou foldl, comme:

(define hash 
    (lambda (c) 
    (foldl (lambda (x y) (+ (cv x) (* 12 y))) 600 (reverse c)))) 
+0

merci cela m'a aidé à résoudre mon problème! –