【发布时间】:2019-05-21 23:14:54
【问题描述】:
我已经为此绞尽脑汁了一段时间。
使用reduce时——为什么不执行块中定义的操作就返回第一个元素?还是我错过了减少如何工作的关键点?
在以下示例中:
arr = [1, 3, 5]
arr.reduce {|sum, n| sum + (n * 3) }
#=> 25
我预计结果是 27。
自:
0 + (1 * 3) = 3
3 + (3 * 3) = 12
12 + (5 * 3) = 27
玩了一段时间后,我发现在第一个“tick”中 - 数组中的对象只是被添加到总和而不是相乘。这样计算更像:
??? = 1
1 + (3 * 3) = 10
10 + (5 * 3) = 25
有人可以帮我弄清楚我在哪里偏离了道路吗?
【问题讨论】:
-
[1, 3, 5].reduce(0) { |sum, n| sum + n * 3 }是您想要的——它使用初始值0(或您传递的任何值),因此返回27而不是25。 -
在你的第一个方程中,零是从哪里来的?不在数组中?
-
@JörgWMittag - 我希望 sum 的初始值默认为零。
-
想象一下,如果您想计算阶乘。乘法的中性元素是 1,而不是 0。或者,如果您想构造一些字符串。字符串连接的中性元素是空字符串。或者,你想建立一个哈希;哈希合并的中性元素是空哈希。为了选择正确的中性元素,Ruby 必须读懂你的想法才能知道你想要计算的是什么!如果你这样想,应该清楚为什么元素只能来自数组。
标签: ruby functional-programming reduce