使用三个参数在 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
的下一项,并且该总和与计算的余数相结合。
相反,只需使用 f
将 lst
的下一个元素与减少 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
我的任务是实现一个 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
的下一项,并且该总和与计算的余数相结合。
相反,只需使用 f
将 lst
的下一个元素与减少 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