一个非VBArecursion阶乘函数?
是否有可能通过启用循环引用(在Excel Options
的Formulas
部分中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 = 10
和initializing = 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个单元格: number
, factorial
和iteration
。
首先,使用迭代计算时应该记住的主要事件是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,直到你没有得到它。