【问题标题】:Scheme reduce trouble方案减少麻烦
【发布时间】:2017-09-20 16:16:33
【问题描述】:

我有一个类似这样的方案函数,可以为给定的输入生成哈希值

 (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 函数的。

【问题讨论】:

    标签: functional-programming scheme lisp racket


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-25
      • 2014-11-20
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多