球拍复杂的减少功能

时间:2019-03-10 09:28:20

标签: functional-programming scheme lisp racket

我正在尝试以比通常使用的更复杂的方式使用reduce函数。我什至不知道这是否可行,但这是我想要做的:

给出一个列表(1 2 3)和两个常量,让它们分别为913,我试图用reduce来结束:

(+ 1 (* 9 (+ 2 (* 9 (+ 3 (* 9 13))))))

我尝试了将13加到then列表后面的方法,所以我不得不(1 2 3 13)然后尝试使用Lambda进行映射并归约,但是我找不到正确的答案。

我会发布我尝试过的代码,但是我的互联网断开了,我正在手机上键入此代码,所以很抱歉,我无法显示我试图做的事情,但是目标是表达式的形式上面使用reduce

1 个答案:

答案 0 :(得分:3)

建议的操作确实可以实现为reduce(又称foldr):

(+ 1 (* 9 (+ 2 (* 9 (+ 3 (* 9 13))))))
=> 9739

(reduce (lambda (e acc) (+ e (* 9 acc)))
        13
        '(1 2 3))
=> 9739

关于常量,13在最里面的表达式中仅使用一次,因此很适合用作初始值。 9用于将累计值相乘。当递归开始展开时,输入列表从右到左使用,这时我们将当前元素添加到累加结果中。