Functional programming 减少麻烦的方案
我有一个类似于so的scheme函数,它为给定的输入生成一个散列值Functional programming 减少麻烦的方案,functional-programming,scheme,lisp,racket,Functional Programming,Scheme,Lisp,Racket,我有一个类似于so的scheme函数,它为给定的输入生成一个散列值 (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是唯一的数字 我的问题是我做错了什么,我的价值观
(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函数的。您在
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)))
(define hash
(lambda (c)
(foldl (lambda (x y) (+ (cv x) (* 12 y))) 600 (reverse c))))
或foldl
,如:
(define hash
(lambda (c)
(foldr (lambda (x y) (+ (cv x) (* 12 y))) 600 c)))
(define hash
(lambda (c)
(foldl (lambda (x y) (+ (cv x) (* 12 y))) 600 (reverse c))))
在
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)))
(define hash
(lambda (c)
(foldl (lambda (x y) (+ (cv x) (* 12 y))) 600 (reverse c))))
或foldl
,如:
(define hash
(lambda (c)
(foldr (lambda (x y) (+ (cv x) (* 12 y))) 600 c)))
(define hash
(lambda (c)
(foldl (lambda (x y) (+ (cv x) (* 12 y))) 600 (reverse c))))