我一直在使用一段我发现here的Ruby代码。
这是代码:
a = [1, 4, 7, 13]
def add(ary, idx, sum)
(idx...ary.length).each do |i|
add(ary, i+1, sum + ary[i])
end
puts sum
end
add(a, 0, 0)
事实是,我不需要它吐出添加所有总和的结果。我需要总和的最小值,最大值,中位数和平均值。
如何修改此代码才能获取它们?我是Ruby的初学者。我一直在使用此代码,然后将结果传输到Excel以获取我想要的值。但感觉我的方法可能更有效率。
谢谢您的帮助。
编辑:预期结果 - 目前代码在我的屏幕上吐出:
25
12
18
5
21
8
14
1
24
11
17
4
20
7
13
0
我希望它吐出最小值,平均值,中值和最大值:
0
12.5
12.5
25
a = [1, 4, 7, 13]
def all_sums(array)
combination_lengths = (0..array.length)
all_combinations = combination_lengths.flat_map do |c|
array.combination(c).to_a
end
all_combinations.map(&:sum)
end
def print_min_max_avg_med(array)
puts array.min
puts array.max
puts array.sum.to_f / array.length
sorted_arr = array.sort
puts sorted_arr[(array.length - 1) / 2] + sorted_arr[array.length / 2] / 2.0
end
print_min_max_avg_med(all_sums(a))
好的,我们可以将它们存储在一个数组中,而不是输出值,而是使用该数组来获取所需的值。 (由Stefan Pochmann咀嚼后编辑)
a = [1, 4, 7, 13]
def add(ary, idx, sum, results = nil)
unless results
results = []
first_run = true
end
(idx...ary.length).each do |i|
add(ary, i+1, sum + ary[i], results)
end
results << sum
if first_run
puts results.min
puts results.inject(&:+).to_f / results.size
puts (results.sort[((results.size - 1) / 2)] + results.sort[(results.size / 2)]) / 2.0
puts results.max
end
end
add(a, 0, 0)
好吧,在看了Pochmann和Bronca的例子之后,我在google搜索之后把它放在一起以获得更好的中位数。
a = [1, 4, 7, 13]
def all_sums(array)
combination_lengths = (0..array.length)
all_combinations = combination_lengths.flat_map do |c|
array.combination(c).to_a
end
all_combinations.map(&:sum)
end
def median(array)
sorted = array.sort
len = sorted.length
(sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0
end
def print_min_max_avg_med(array)
puts array.min
puts array.empty? ? 0 : array.sum.to_f / array.length
puts median(array)
puts array.max
end
print_min_max_avg_med(all_sums(a))
我已经运行了一些测试,它似乎适用于奇数和偶数数组。希望这对未来其他人坚持我现在的位置是有用的。
谢谢所有帮助过的人。
最小和最大
最小和最大很容易。
def min_and_max_of_sums a
return [nil, nil] if a.empty?
negs, nonnegs = a.partition { |n| n < 0 }
[negs.any? ? negs.sum : nonnegs.min, nonnegs.any? ? nonnegs.sum : negs.max]
end
min_and_max_of_sums [1, 4, -5, 7, -8, 13]
#=> [-13, 25]
min_and_max_of_sums [1, 2, 3]
#=> [1, 6]
min_and_max_of_sums [-1, -2, -3]
#=> [-6, -1]
min_and_max_of_sums []
#=> [nil, nil]
意思
现在考虑平均值的计算。
如果n是数组a的大小,则包含0和n个元素之间的元素的2n个组合。此外,每个组合之间存在1-1映射,并且n和向量的n向量,当且仅当元素ai包含在组合中时,n向量的第i个元素等于1。注意,有2n个这样的n向量,一半在第i个位置包含1。这意味着一半的组合包含元素ai。由于我是任意的,因此a的每个元素都出现在组合的一半中。
所有组合的所有元素之和的平均值等于T / 2n,其中T是每个组合的元素之和的总和。每个元素ai以2n / 2个组合出现,因此它对T的贡献等于(以Ruby术语表示)
a[i] * 2**(n)/2
由于这适用于a的每个元素,均值等于
a.sum * (2**(n)/2)/2**(n)
=> a.sum/2
这是一个例子。对于阵列
a = [1, 4, 8]
总和的平均值是
a.sum/2
#=> 13/2 => 6.5
如果我们按照定义计算平均值,我们将执行以下计算(当然得到相同的返回值)。
(0 + (1) + (4) + (8) + (1+4) + (1+8) + (4+8) + (1=4+8))/2**3
#=> (4*1 + 4*4 + 4*8)/8
#=> (1 + 4 + 8)/2
#=> 6.5
我将中位数的计算留给其他人。
1搜索“二项式系数的和”here。