Catalan- Numbers Algorithm
In combinatorial mathematics, the Catalan numbers form a sequence of natural numbers that happen in various counting problems, often involve recursively-specify objects. They are named after the Belgian mathematician Eugène Charles Catalan (1814–1894).
The Catalan sequence was described in the 18th century by Leonhard Euler, who was interested in the number of different ways of divide a polygon into triangles. For case, Ming used the Catalan sequence to express series expansions of sin(2α) and sin(4α) in terms of sin(α).In 1988, it get to light that the Catalan number sequence had been used in China by the Mongolian mathematician Mingantu by 1730.
/** Print all the Catalan numbers from 0 to n, n being the user input.
* A Catalan number satifies the following two properties:
* C(0) = C(1) = 1; C(n) = sum(C(i).C(n-i-1)), from i = 0 to n-1
* Read more about Catalan numbers here:
https://en.wikipedia.org/wiki/Catalan_number
*/
#include <iostream>
using namespace std;
int *cat; // global array to hold catalan numbers
unsigned long int catalan_dp(int n)
{
/** Using the tabulation technique in dynamic programming,
this function computes the first `n+1` Catalan numbers
Parameter
---------
n: The number of catalan numbers to be computed.
Returns
-------
cat[n]: An array containing the first `n+1` Catalan numbers
*/
// By definition, the first two Catalan numbers are 1
cat[0] = cat[1] = 1;
// Compute the remaining numbers from index 2 to index n, using tabulation
for (int i = 2; i <= n; i++)
{
cat[i] = 0;
for (int j = 0; j < i; j++)
cat[i] += cat[j] * cat[i - j - 1]; // applying the definition here
}
// Return the result
return cat[n];
}
int main(int argc, char *argv[])
{
int n;
cout << "Enter n: ";
cin >> n;
cat = new int[n + 1];
cout << "Catalan numbers from 0 to " << n << " are:\n";
for (int i = 0; i <= n; i++)
{
cout << "catalan (" << i << ") = " << catalan_dp(i) << endl;
// NOTE: Since `cat` is a global array, calling `catalan_dp`
// repeatedly will not recompute the the values already computed
// as in case of pre-computed values, the array will simply return them,
// instead of recomputing them.
}
return 0;
}
/** Sample Test Case:
$ cd "Dynamic Programming"
$ g++ Catalan-Numbers.cpp
$ ./a.exe
Enter n: 5
Catalan numbers from 0 to 5 are:
catalan (0) = 1
catalan (1) = 1
catalan (2) = 2
catalan (3) = 5
catalan (4) = 14
catalan (5) = 42
*/