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