非 VBA 递归阶乘函数?

Joh*_*man 5 excel recursion excel-formula

是否可以通过启用循环引用(enable iterative calculation在 的Formulas部分中选择Excel Options),在 Excel 中创建递归阶乘函数?我FACT()当然知道并且我不是在寻找一种计算阶乘的实用方法。相反,我的目标是找到一种方法来利用循环引用作为在 Excel 中创建和使用递归函数的通用工具,阶乘提供了一个有趣的测试用例。

使用 Jan Karel Pietrse网站上的一个想法,我能够接近,但结果函数取决于两个单元格而不仅仅是一个单元格,因此它不能解决问题。在

在此处输入图片说明

我使用顶行中的字符串创建了命名范围。在现在命名的单元格中,factorial我输入:

=IF(initializing,1,IF(factor=0,factorial,factorial*factor))
Run Code Online (Sandbox Code Playgroud)

factor我输入的单元格中:

=IF(initializing,n,IF(factor=0,factor,factor-1))
Run Code Online (Sandbox Code Playgroud)

上图显示了 whenn = 10和 的样子initializing = True。公式factorial对应于函数式编程中的标准技巧,通过引入具有累加参数的辅助函数来使递归函数尾调用递归。问题是需要调用辅助函数,阶乘中的公式在某种意义上既是函数本身又是它的辅助函数,其内容是initializing确定当前扮演什么角色。

我的工作原理是,如果我将 的值initializing从 True切换(例如删除它),那么 的值将factorial成为正确的阶乘:

在此处输入图片说明

可以initializing从图片中删除吗?是否可以修改设置,以便例如n更改为 5 然后factorial立即更改为 120,而无需先设置然后更改其他一些单元格?我尝试了几种不同的方法,但最终还是使用 2 步而不是 1 步函数。也许一些涉及数组公式的魔法?

Mát*_*ász 4

这是一个只有一个辅助单元格的公式,每当n更改时都会自动更新,当然辅助列比原始列更复杂:
在此输入图像描述

  • 帮手:=IF(C2<>TEXT(A2,"0"),IF(ISNUMBER(C2),IF(C2=A2,TEXT(A2,"0"),C2+1),1),C2)
  • 阶乘:=IF(ISNUMBER(C2),IF(C2=1,1,C2*D2),D2)

关键是在达到结果时更改辅助单元格(也可以否定,用文本完成(例如A1&" Finished",重要的是要清楚地表明它已达到计算结束并保持其与输入单元格的可比性)。

只是为了好玩,F2 中没有迭代的数组公式:=PRODUCT(ROW(INDIRECT("a1:a"&A2,TRUE)))

更新

公式一步步:
助手:

  • 稳定状态被格式化为文本,只要文本的值与n没有发生相同,公式不会改变中的值helper
  • 一旦n更改:第一个条件C2<>TEXT(A2,"0")将为 false,但helper仍然是文本,因此第二个条件也是 false,helper重置为 1
  • 之后helper递增直至达到n,当达到目标时helper转换为文本以标记计算完成

阶乘:

  • helper是文本时什么也没有发生
  • Oncehelper是数字:如果它是 1,则factorial重置为 1,否则helper * factorial计算乘法