Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby中的数组乘法难题_Ruby_Arrays - Fatal编程技术网

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 | arr
1.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
。也许
可枚举#部分注入