【问题标题】:Excel's LAMBDA with a "kind of" composite functionExcel\'s LAMBDA 与 \"kind of\" 复合函数
【发布时间】:2022-08-02 11:38:19
【问题描述】:

自从我了解到 Excel 现在是图灵完备的,我明白我现在可以使用专门的公式“编程”Excel,因此不使用任何 VBA。

我不知道我的结论是对还是错。事实上,我并不介意。

然而,令我满意的是,我已经能够在公式中“编程”两个最基本的程序流结构:1-分支控制流(使用 IF 函数在 excel 中没有秘密)和 2-循环(FOR , WHILE, UNTIL 循环)。

让我更详细地解释一下我的发现。 (备注:因为我使用的是西班牙语版的 Excel 365,公式中的字段分隔符是分号 (\";\") 而不是逗号 (\",\")。

AN- FOR 循环中的累加器

B- 阶乘(使用产品)

C- WHILE 循环

D-UNTIL 循环

E- 内部/外部范围的概念

现在,我的提问时间到了:

我想使用一个实际上是一组公式的公式

我想为“元组”中的第一个数字使用累加器,而我想为元组中的第二个数字使用阶乘。而这一切都使用一个单一的 excel 公式。我想我离成功并不遥远。

REDUCE 函数接受包含 2 个 LAMBDAS 而不是单个 LAMBDA 函数的 LET 函数。到这里为止,一切都很完美。但是,LET 函数似乎只返回一个“单个”函数而不是函数元组

我可以返回(在图片中)函数 \"x\" 或函数 \"y\" 但不能返回元组 (x,y)。

我曾尝试使用 HSTACK(x,y),但它似乎不起作用。

我知道这是一个复杂的问题,但我已尽力让自己理解。

任何人都可以给我任何关于如何解决我的问题的线索吗?

  • =REDUCE(0,SEQUENCE(5),LET(x,LAMBDA(a,b,a+b),y,LAMBDA(a,b,a*b),CHOOSE({1,2},x,y))) 对我有用,我没有 HSTACK,我使用 , 而不是 ;{1,2} 对我来说是一个水平数组。
  • 谢谢你,斯科特,但它对我不起作用。 REDUCE 函数的第一个参数应该是 {0, 1} 我总是得到 0(零)作为这个 REDUCE 公式的第二个单元格,这是不正确的,因为阶乘永远不会为零
  • 然后在 LET 中执行两个 REDUCE:=LET(seq,SEQUENCE(5),x,REDUCE(0,seq,LAMBDA(a,b,a+b)),y,REDUCE(1,seq,LAMBDA(a,b,a*b)),CHOOSE({1,2},x,y)
  • 有用 !!!非常感谢您。您提出的解决方案包括通过 CHOOSE 函数水平堆叠两个值,这是两个 REDUCE 函数的结果。我正在寻找一种解决方案,该解决方案包括水平堆叠两个函数,然后将其应用于常量数组 {0, 1} 以产生结果,但我得出结论,不管它是真是假,即函数不能堆叠。或者,至少,这在我看来是这样。

标签: excel lambda excel-formula office365 excel-lambda


【解决方案1】:

非常好的问题。

我注意到在你的尝试中你给了REDUCE() a单身的第一个参数中的常数值。有趣的是,文档无处说明你不能在数组格式.因此,您可以使用第一个参数以(您的情况;水平)数组格式提供所有常量,并且当您遍历第二个参数的数组时,您可以使用 CHOOSE() 应用不同类型的逻辑:

=REDUCE({0,1},SEQUENCE(5),LAMBDA(a,b,CHOOSE({1,2},a+b,a*b))) 

这样,您就有了一个 REDUCE() 函数,内部进程将从数组形式的第一个参数更新给定的常量。您现在可以开始水平堆叠多个函数并输入一个常量数组,例如:

=REDUCE({0,1,100},SEQUENCE(5),LAMBDA(a,b,CHOOSE({1,2,3},a+b,a*b,a/b)))

我想你必须使用{0\1}{1\2},就像我在荷兰版的 Excel 中一样。


给定你的累加器:

A1 中的公式:

=REDUCE(F1:G1,SEQUENCE(F3),LAMBDA(a,b,CHOOSE({1,2},a+b,a*b)))

【讨论】:

  • 优秀的答案,JvdV,绝对是我正在寻找的答案:谢谢
  • 现在我可以在循环中使用尽可能多的函数
  • 只有一个重要的评论:您的公式适用于 CHOOSE 函数,但似乎不适用于 HSTACK。这让我感到困惑,因为我的理解是这两个功能可以相互互换。也许您可以告诉我,我最喜欢的 HSTACK 是否适合您,因为它少了一个参数。
  • @vsoler,我有一个HSTACK() 替代方案,但由于HSTACK() 也采用数组,它会堆叠太多值。相反,我选择了CHOOSE(),这似乎不起作用。仅供参考,为了克服我不得不使用INDEX() 的问题,但由于这似乎太冗长,我将其从答案中删除。 =REDUCE({0,1},SEQUENCE(5),LAMBDA(a,b,HSTACK(INDEX(a,1)+b,INDEX(a,2)*b)))
  • 我也喜欢您使用 HSTACK/INDEX 的解决方案,我觉得它非常实用。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-27
相关资源
最近更新 更多