Function Stirling2nd(n As Long, k As Long) As Double
' shg 2019
' Returns the Stirling Number of the Second Kind* using the recurrence relation
' at http://mathworld.wolfram.com/StirlingNumberoftheSecondKind.html
' S(0, 0) = 1
' S(n, 0) = S(0, n) = 0 for n > 0
' Then S(n, k) = S(n - 1, k - 1) + k * S(n - 1, k)
' * the total number of ways to partition n labeled items into k non-empty subsets
' https://en.wikipedia.org/wiki/Stirling_numbers_of_the_second_kind
Dim i As Long
Dim j As Long
Dim adS() As Double
If n < 0 Or k < 0 Or k > n Then
Stirling2nd = 0#
Else
ReDim adS(0 To n, 0 To k)
adS(0, 0) = 1#
For i = 1 To n
For j = 1 To IIf(k <= i, k, i)
adS(i, j) = adS(i - 1, j - 1) + j * adS(i - 1, j)
Next j
Next i
Stirling2nd = adS(n, k)
End If
End Function
E.g,
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
N |
1 |
n \ k |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|
|
2 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
C2: =Stirling2nd(n, k) |
3 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
|
4 |
2 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
|
5 |
3 |
0 |
1 |
3 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
|
6 |
4 |
0 |
1 |
7 |
6 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
|
|
7 |
5 |
0 |
1 |
15 |
25 |
10 |
1 |
0 |
0 |
0 |
0 |
0 |
|
|
8 |
6 |
0 |
1 |
31 |
90 |
65 |
15 |
1 |
0 |
0 |
0 |
0 |
|
|
9 |
7 |
0 |
1 |
63 |
301 |
350 |
140 |
21 |
1 |
0 |
0 |
0 |
|
|
10 |
8 |
0 |
1 |
127 |
966 |
1,701 |
1,050 |
266 |
28 |
1 |
0 |
0 |
|
|
11 |
9 |
0 |
1 |
255 |
3,025 |
7,770 |
6,951 |
2,646 |
462 |
36 |
1 |
0 |
|
|
12 |
10 |
0 |
1 |
511 |
9,330 |
34,105 |
42,525 |
22,827 |
5,880 |
750 |
45 |
1 |
|
|
Bookmarks