一个非VBArecursion阶乘函数?

是否有可能通过启用循环引用(在Excel OptionsFormulas部分中selectenable iterative calculation ),在Excel中创build一个recursion阶乘函数? 我当然知道FACT() ,而不是寻找计算阶乘因子的实用方法。 相反,我的目标是find一种方法来利用循环引用作为在Excel中创build和使用recursion函数的一般工具,并且阶乘提供了一个有趣的testing用例。

使用Jan Karel Pietrerse的网站的一个想法,我能够接近,但是由此产生的function依赖于两个单元而不是一个单元,所以它不能解决问题。 在

在这里输入图像说明

我使用顶行中的string创build了命名范围。 在我现在命名为factorial的单元格中input:

 =IF(initializing,1,IF(factor=0,factorial,factorial*factor)) 

并在我input的单元格中:

 =IF(initializing,n,IF(factor=0,factor,factor-1)) 

上面的图片显示了当n = 10initializing = True 。 因式中的公式对应于函数式编程中的一个标准技巧,通过引入具有累加参数的辅助函数来进行recursion函数尾调用recursion 。 问题是辅助函数需要被调用,factorial中的公式在某种意义上是函数本身和辅助函数, initializing的内容决定了它正在播放的angular色。

如果我将initializing的值从True切换(例如,只是删除它),那么factorial的值就成为正确的因子:

在这里输入图像说明

initializing可以从图片中删除吗? 是否可以修改设置,以便如果例如n变为5,那么factorial立即变为120,而不需要先设置,然后更改其他单元格? 我已经尝试了几个不同的事情,但不断结束了两步而不是一步function。 也许一些涉及数组公式的巫术?

这是一个只有一个帮助单元的公式,每当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" ,重要的是要清楚它达到了计算的结束,并且保持与input单元的可比性)。

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

更新

配方一步一步:
帮手:

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

阶乘:

  • helper是文本没有任何反应
  • 一旦helper是数字:如果它是1,那么factorial重置为1,否则计算乘数helper * factorial

这就是我的评论意思 – 每当“n”改变值时,使用VBA“检查/取消”初始化框。

我用你在例子中命名的范围来试试这个,它适用于我。 可以外推用于其他目的; 这里的关键是,你仍然需要一个“初始化”单元[你真的可以'初始化'是一个命名的范围,只是指一个布尔值,而不是一个包含布尔值的单元格],但是至less自动化。

 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = Range("n").Address Then Range("initializing").Formula = True Range("initializing").Formula = False End If End Sub 

使用VBA

 Public Function factoid(n As Long) As Long If n = 1 Then factoid = 1 Else factoid = factoid(n - 1) * n End If End Function 

是的,可以从algorithm中删除“初始化”variables。

我们来看一个例子。

图片

图片

我得到了3个单元格: numberfactorialiteration

首先,使用迭代计算时应该记住的主要事件是IF语句检查0,因为默认情况下空单元格为0,并且,正如我们所知,乘法(factorial的主要部分)中的零是不好的理念。

iteration单元得到这个公式: =IF(i=0, number+1,i-1)

factorial单元得到了这个公式: =IF(factorial=0, 1, IF(i=1, factorial, factorial*i))

因此,如果在iteration单元格为0或1(这取决于Excel的select,还有月相),因此您应该得到正确的答案。

当然,通过更改number您可以注意到iteration单元不是0或1, factorial看起来不像期望的结果。 尝试按F9,直到你没有得到它。