使用三个参数在 racket 中实现 reduce 过程:function、base 和 list

Implementation of a reduce procedure in racket with three arguments: function, base and a list

我的任务是实现一个 reduce 过程,该过程采用对列表中的每个数字进行加法、乘法或除法的函数。我坚持论据基础。我已经能够检查数字列表并应用作为参数传递的函数。但是,在递归调用中,我不知道如何处理基数。我不希望递归考虑每次调用中的参数基数(基数可以是任何数字)。

这是我能够做到的:

(define (reduce f base lst)
  (cond ((empty? lst) base)
        (else (f (f base (first lst)) (reduce f base (rest lst))))))

当基数为 0 时,它通过加法测试:

> (test (reduce + 0 '(1 2 3)) 6)
good (reduce + 0 '(1 2 3)) at line 3
  expected: 6
  given: 6

但是,当base为1时,测试失败,因为每次递归调用时都会添加base:

> (test (reduce + 1 '(1 2 3)) 7)
bad (reduce + 1 '(1 2 3)) at line 13
  expected: 7
  given: 10

如果 lst 中有参数要处理,那么您想将第一个参数与处理其余 lst 的结果结合起来。但是,对于 (f (f base (first lst)) (reduce f base (rest lst))),发布的代码将 (f base (first lst)) 的结果与处理其余 lst 的结果相结合。由于测试使用 +,这意味着在每一步 base 都被添加到 lst 的下一项,并且该总和与计算的余数相结合。

相反,只需使用 flst 的下一个元素与减少 lst 的其余部分的结果相结合:

(define (reduce f base lst)
  (cond ((empty? lst) base)
        (else (f (first lst) (reduce f base (rest lst))))))
scratch.rkt> (reduce + 1 '(1 2 3))
7