ruby中的数组乘法难题
我有一个数组:ruby中的数组乘法难题,ruby,arrays,Ruby,Arrays,我有一个数组: x = [1,2,3,4,5] 我想得到: output = [1,2,6,24,120] 希望你能看到我在这里想要实现的模式和目标x[1]是 转换为x[1]*x[0]x[2]=>x[2]*x[1]*x[0]等 在Ruby中实现这一点最有效的方法是什么?您可能希望创建一个递归解决方案 F(x) = if x < 1 return 0 else return A(x) * F(x - 1) F(x)=如果x [1, 2, 3, 4, 5] 1.
x = [1,2,3,4,5]
我想得到:
output = [1,2,6,24,120]
希望你能看到我在这里想要实现的模式和目标<代码>x[1]是
转换为x[1]*x[0]
<代码>x[2]=>x[2]*x[1]*x[0]
等
在Ruby中实现这一点最有效的方法是什么?您可能希望创建一个递归解决方案
F(x) = if x < 1 return 0
else return A(x) * F(x - 1)
F(x)=如果x<1,则返回0
否则返回A(x)*F(x-1)
在最简单的数学形式中,F是结果数组,A是源数组(索引为x)。您可能需要进行递归求解
F(x) = if x < 1 return 0
else return A(x) * F(x - 1)
F(x)=如果x<1,则返回0
否则返回A(x)*F(x-1)
在最简单的数学形式中,F是结果数组,A是源数组(索引为x)。您可以使用以下代码
a=1;output = x.map{|i|a*=i}
例如,您可以使用以下代码
a=1;output = x.map{|i|a*=i}
我会这样做的
prev = 1
puts [1,2,3,4,5].map { |n| prev *= n }
我会这样做的
prev = 1
puts [1,2,3,4,5].map { |n| prev *= n }
1.9.2(主):0>a
=> [1, 2, 3, 4, 5]
1.9.2(main):0>a.注入([]){| arr,e | arr1.9.2(main):0>a
=> [1, 2, 3, 4, 5]
1.9.2(main):0>a.injection([]){arr,e|arr只是为了好玩
[1,2,3,4,5].map.with_index{|a,i| ar[0,i+1].inject(:*)}
只是为了好玩
[1,2,3,4,5].map.with_index{|a,i| ar[0,i+1].inject(:*)}
这是一个非常通用的抽象,通常用函数式语言调用。一个可能的Ruby实现:
module Enumerable
def scanl(&block)
self.inject([]) do |acc, x|
acc.concat([acc.empty? ? x : yield(acc.last, x)])
end
end
end
>> [1, 2, 3, 4, 5].scanl(&:*)
=> [1, 2, 6, 24, 120]
这是一个非常通用的抽象,通常用函数式语言调用。一个可能的Ruby实现:
module Enumerable
def scanl(&block)
self.inject([]) do |acc, x|
acc.concat([acc.empty? ? x : yield(acc.last, x)])
end
end
end
>> [1, 2, 3, 4, 5].scanl(&:*)
=> [1, 2, 6, 24, 120]
x.inject([])do |结果,arr|u元素|
last_num=result.last
结果x.injection([])do | result,arr|u元素|
last_num=result.last
结果不是最后一个数字应该是120而不是60吗?因此,对于所有i>0
,out[i]=x[i]*out[i-1]
?为我愚蠢的错误感到抱歉!刚刚修复,谢谢@jimbojw:不,我实际上需要这个来进行时间序列操作。我知道的唯一方法是通过愚蠢的for循环,所以我正在尝试看看ruby是否有更聪明的方法来实现这一点。这个抽象在函数式语言中称为scanl:。您可以编写它:scanl1(*)[1,2,3,4,5]#=>[1,2,6,24120]最后一个数字不应该是120而不是60吗?因此,对于所有i>0
,out[i]=x[i]*out[i-1]
?为我愚蠢的错误感到抱歉!刚刚修复,谢谢@jimbojw:不,我实际上需要这个来进行时间序列操作。我知道的唯一方法是通过愚蠢的for循环,所以我正在尝试看看ruby是否有更聪明的方法来实现这一点。这个抽象在函数式语言中称为scanl:。您可以编写它:scanl1(*)[1,2,3,4,5]#=>[1,2,6,24120]映射确实适用于x
的每个元素,并相应地更新变量a
(即所有元素一个接一个地相乘)由于赋值同时返回其结果,映射操作收集这些中间结果,从而生成所需的数组。map
确实应用于x
的每个元素,并相应地更新变量a
(即,所有元素一个接一个地相乘)。由于赋值同时返回其结果,映射操作将收集这些中间结果,从而生成所需的数组。多年来,我一直想为Enumerable#scan
编写一个功能请求,但我总是被跟踪…@JörgWMittag:我们首先应该找到一个合适的名称,因为已经有一个完整的非常不相关的String#scan
。也许Enumerable#partial#u injection
?我想为Enumerable#scan
写一个功能请求已经好几年了,但我总是被忽略了…@JörgWMittag:我们首先应该找到一个合适的名字,因为已经有一个完全不相关的String#scan
。也许可枚举#部分注入
?