生成 1 列的所有组合

问题描述 投票:0回答:1

我想为 Google 表格创建一个函数,允许我像图片一样列出 A 列中数字的所有可能组合,但不仅仅是 4 个值,我可以在 A 列中有超过 20 个。

example

非常感谢任何帮助!

注意:我测试了一些解决方案,似乎更接近的是here,但是给我这个:“错误:您无权调用setValues(第35行)。” (原来的错误是葡萄牙语)。

note 2.: Sum of all number combinations excluding repetition Excel 的建议给我公式错误,只显示 4 个值。

google-sheets combinations
1个回答
0
投票

组合的数量,或者更准确地说,唯一的 n 元组,随着值数量的增加而快速增长。使用 20 个值,您将获得大约一百万个元组,这些元组在矩阵中总共包含大约 2000 万个元素。这太多了,无法在电子表格中轻松处理。

另一方面,如果有 15 个值,您只需要生成大约 30,000 个元组和大约 650,000 个元素,这更易于管理。为此,首先计算笛卡尔积,然后对结果进行过滤、求和和格式化,如下所示:

=let( 
  values, torow(A2:A, 1), 
  zeros, map(values, lambda(_, 0)), 
  table, { zeros; values }, 
  blank, iferror(1/0), 
  first_, lambda(array, tocol(choosecols(array, 1), true)), 
  rest_, lambda(n, choosecols(table, sequence(1, columns(table) - n, n + 1))), 
  wrap_, lambda(array, wrapCount, wraprows(tocol(array, true), wrapCount)), 

  cartesian_, lambda(a, b, wrap_( 
    byrow(a, lambda(row, 
      reduce(blank, sequence(rows(b)), lambda(acc, i, 
        { acc, row, chooserows(b, i) } 
      ) ) 
    ) ), 
    columns(a) + columns(b) 
  ) ), 

  iterate_, lambda( 
    self, a, b, if(iserror(b), a, 
      self(self, cartesian_(a, first_(b)), rest_(columns(a) + 1)) 
    ) 
  ), 

  cartesian, iterate_(iterate_, first_(table), rest_(1)), 
  sums, byrow(cartesian, lambda(row, sum(row))), 
  expressions, byrow(cartesian, lambda(row, join(" + ", filter(row, row)))), 
  sort(unique(filter({ expressions, sums }, sums))) 
)

问题并不清楚单个值是否应该可重复,如果是,每个值最多应该重复多少次。如果您想最多重复每个值两次,请使用像

1, 1, 2, 2, 3, 3, 4, 4
.

这样的值列表

以下是具有 4 个值的结果示例:

价值观 说明 总和
1 1 1
2 1 + 2 3
3 1 + 2 + 3 6
4 1 + 2 + 3 + 4 10
1 + 2 + 4 7
1 + 3 4
1 + 3 + 4 8
1 + 4 5
2 2
2 + 3 5
2 + 3 + 4 9
2 + 4 6
3 3
3 + 4 7
4 4
© www.soinside.com 2019 - 2024. All rights reserved.