Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 减少麻烦的方案_Functional Programming_Scheme_Lisp_Racket - Fatal编程技术网

Functional programming 减少麻烦的方案

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是唯一的数字 我的问题是我做错了什么,我的价值观

我有一个类似于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是唯一的数字

我的问题是我做错了什么,我的价值观有点偏离了,找不到问题所在

预期产量

(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))))