Реализации алгоритмов/Числа Стирлинга второго рода
(перенаправлено с «Программное вычисление чисел Стирлинга второго рода»)
Delphi
правитьtype
TTwoDimArray = array of array of Double;
procedure GetStirlingNumbers(n_max, m_max: Integer; var StirlingNumbers: TTwoDimArray);
var
I, J: Integer;
begin
{ Выделение памяти под массив чисел }
SetLength(StirlingNumbers, n_max+1, m_max+1);
{ Заполнение массива }
{ S(n,0) = 0 }
for I := 0 to n_max do
StirlingNumbers[I, 0] := 0;
{ S(n,n) = 1 }
for I := 0 to n_max do
StirlingNumbers[I, I] := 1;
{ S(n,m) = S(n-1,m-1) + m*S(n-1,m) }
for I := 1 to n_max do
for J := 1 to I-1 do
StirlingNumbers[I, J] := StirlingNumbers[I-1, J-1] + J * StirlingNumbers[I-1, J];
end;
C#
правитьvoid GetStirlingNumbers(int n_max, int m_max, double[,] StirlingNumbers)
{
// Выделение памяти под массив чисел
StirlingNumbers = new double [n_max+1, m_max+1];
// Заполнение массива
// S(n,0) = 0
for (int i = 0; i < n_max; i++)
StirlingNumbers[i, 0] = 0;
// S(n,n) = 1
for (int i = 0; i < n_max; i++)
StirlingNumbers[i, i] = 1;
// S(n,m) = S(n-1,m-1) + m*S(n-1,m)
for (int i = 1; i <= n_max; i++)
for (int j = 1; j <= i-1; j++)
StirlingNumbers[i, j] = StirlingNumbers[i-1, j-1] + j * StirlingNumbers[i-1, j];
}
C++
правитьdouble Stirling (int N, int K)
{
if (N==K) return 1;
else
if (K==0 or N == 0 or N < K) return 0;
else
return Stirling(N-1,K-1) + K * Stirling(N-1,K);
}