Реализации алгоритмов/Числа Стирлинга второго рода

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;
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];
}
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);

}