用函数、基和列表三个参数在racket中实现reduce过程

用函数、基和列表三个参数在racket中实现reduce过程,racket,Racket,我的任务是实现一个reduce过程,该过程使用一个函数,对列表中的每个数字进行相加、相乘或相除。我被论点的基础所束缚。我已经能够检查数字列表并应用作为参数传递的函数。然而,在递归调用中,我不知道如何处理基数。我不希望递归在每次调用中都考虑参数base(base可以是任何数字) 以下是我能够做到的: (define (reduce f base lst) (cond ((empty? lst) base) (else (f (f base (first lst)) (reduc

我的任务是实现一个reduce过程,该过程使用一个函数,对列表中的每个数字进行相加、相乘或相除。我被论点的基础所束缚。我已经能够检查数字列表并应用作为参数传递的函数。然而,在递归调用中,我不知道如何处理基数。我不希望递归在每次调用中都考虑参数base(base可以是任何数字)

以下是我能够做到的:

(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
的下一项中,并且该总和与计算的剩余部分相结合

相反,只需使用
f
lst
的下一个元素与减少其余
lst
的结果结合起来:

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