用于计算所有可能组合中数字乘积的脚本

时间:2014-06-15 10:13:53

标签: arrays calculated-columns date-arithmetic cartesian-product

我有一个数字分数(百分比),我想为所有数字的每个可能组合计算产品,并且它们与100%的差异。

例如,对于以下数字: 0.3,0.4,0.6,0.7

我想计算以下内容:

  (1-0.3)*(1-0.4)*(1-0.6)*(1-0.7)
  0.3*0.4*0.6*0.7
  0.3*(1-0.4)*(1-0.6)*(1-0.7)
  (1-0.3)*(1-0.4)*(1-0.6)*0.7
  (1-0.3)*0.4*(1-0.6)*(1-0.7)
  (1-0.3)*(1-0.4)*0.6*(1-0.7)
  0.3*(1-0.4)*(1-0.6)*0.7
  0.3*(1-0.4)*0.6*(1-0.7)
  (1-0.3)*(1-0.4)*0.6*0.7
  (1-0.3)*0.4*(1-0.6)*0.7
  (1-0.3)*0.4*0.6*(1-0.7)
  0.3*0.4*(1-0.6)*(1-0.7)
  (1-0.3)*0.4*0.6*0.7
  0.3*(1-0.4)*0.6*0.7
  0.3*0.4*(1-0.6)*0.7
  0.3*0.4*0.6*(1-0.7)

我希望能够为任何n个数字构建这个(这里我给出了4个数字的例子,但可能有成百上千个)。怎么称呼?他们有命令吗?某处是否有已知的脚本? 最后,我需要总结一下。并且也可以单独使用它们。

1 个答案:

答案 0 :(得分:1)

我认为在任何语言中都没有预先定义的命令,但大多数语言都允许您为此编写递归函数。例如,在Haskell中你可以使用:

calculate [] = [[]]
calculate (x:xs) = let rec = calculate xs
                       pos = map (x:) rec
                       neg = map ((1 - x):) rec
                   in pos ++ neg

您可以尝试here并运行您的示例:

main = print (calculate [0.3, 0.4, 0.6, 0.7])

请注意,此calculate函数将百分比列表作为输入并返回列表列表,每个列表代表所需结果中的一行。然后,此结果可用于计算中间结果和最终结果。

该功能的工作原理如下。如果输入为空列表,则返回包含空列表的列表。如果输入包含元素,则将第一个元素(x)与列表的其余部分(xs)分开,并在列表的其余部分计算结果。结果是一个列表,其中包含存储在rec中的百分比列表。

要计算结果值,请将x添加到rec中的每个列表(存储在pos中),并将1-x添加到rec中的每个列表中(存储在neg)中。结果我们返回一个列表,它是posneg的串联。