Catalan numbers are defined as a mathematical sequence that consists of positive integers, which can be used to find the number of possibilities of various combinations.
The nth term in the sequence denoted Cn, is found in the following formula:
The first few Catalan numbers for n = 0, 1, 2, 3, … are : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, …
Catalan numbers occur in many interesting counting problems like the following.
- Count the number of expressions containing n pairs of parentheses that are correctly matched. For n = 3, possible expressions are ((())), ()(()), ()()(), (())(), (()()).
- Count the number of possible Binary Search Trees with n keys (See this)
- Count the number of full binary trees (A rooted binary tree is full if every vertex has either two children or no children) with n+1 leaves.
- Given a number n, return the number of ways you can draw n chords in a circle with 2 x n points such that no 2 chords intersect.
See this for more applications.
Examples:
Input: n = 6
Output: 132
Input: n = 8
Output: 1430
Recursive Solution for Catalan number:
Catalan numbers satisfy the following recursive formula: 
Follow the steps below to implement the above recursive formula
- Base condition for the recursive approach, when n <= 1, return 1
- Iterate from i = 0 to i < n
- Make a recursive call catalan(i) and catalan(n – i – 1) and keep adding the product of both into res.
- Return the res.
Following is the implementation of the above recursive formula.
C++
#include <iostream>
using namespace std;
unsigned long int catalan(unsigned int n)
{
if (n <= 1)
return 1;
unsigned long int res = 0;
for ( int i = 0; i < n; i++)
res += catalan(i) * catalan(n - i - 1);
return res;
}
int main()
{
for ( int i = 0; i < 10; i++)
cout << catalan(i) << " " ;
return 0;
}
|
Java
import java.io.*;
class CatalnNumber {
int catalan( int n)
{
int res = 0 ;
if (n <= 1 ) {
return 1 ;
}
for ( int i = 0 ; i < n; i++) {
res += catalan(i) * catalan(n - i - 1 );
}
return res;
}
public static void main(String[] args)
{
CatalnNumber cn = new CatalnNumber();
for ( int i = 0 ; i < 10 ; i++) {
System.out.print(cn.catalan(i) + " " );
}
}
}
|
Python3
def catalan(n):
if n < = 1 :
return 1
res = 0
for i in range (n):
res + = catalan(i) * catalan(n - i - 1 )
return res
for i in range ( 10 ):
print (catalan(i), end = " " )
|
C#
using System;
class GFG {
static int catalan( int n)
{
int res = 0;
if (n <= 1) {
return 1;
}
for ( int i = 0; i < n; i++) {
res += catalan(i) * catalan(n - i - 1);
}
return res;
}
public static void Main()
{
for ( int i = 0; i < 10; i++)
Console.Write(catalan(i) + " " );
}
}
|
PHP
<?php
function catalan( $n )
{
if ( $n <= 1)
return 1;
$res = 0;
for ( $i = 0; $i < $n ; $i ++)
$res += catalan( $i ) *
catalan( $n - $i - 1);
return $res ;
}
for ( $i = 0; $i < 10; $i ++)
echo catalan( $i ), " " ;
?>
|
Javascript
<script>
function catalan(n)
{
if (n <= 1)
return 1;
let res = 0;
for (let i = 0; i < n; i++)
res += catalan(i) *
catalan(n - i - 1);
return res;
}
for (let i = 0; i < 10; i++)
document.write(catalan(i) + " " );
</script>
|
Output1 1 2 5 14 42 132 429 1430 4862
Time Complexity: The above implementation is equivalent to nth Catalan number.

The value of nth Catalan number is exponential which makes the time complexity exponential.
Auxiliary Space: O(n)
Dynamic Programming Solution for Catalan number:
We can observe that the above recursive implementation does a lot of repeated work. Since there are overlapping subproblems, we can use dynamic programming for this.
Below is the implementation of the above idea:
- Create an array catalan[] for storing ith Catalan number.
- Initialize, catalan[0] and catalan[1] = 1
- Loop through i = 2 to the given Catalan number n.
- Loop through j = 0 to j < i and Keep adding value of catalan[j] * catalan[i – j – 1] into catalan[i].
- Finally, return catalan[n]
Follow the steps below to implement the above approach:
C++
#include <iostream>
using namespace std;
unsigned long int catalanDP(unsigned int n)
{
unsigned long int catalan[n + 1];
catalan[0] = catalan[1] = 1;
for ( int i = 2; i <= n; i++) {
catalan[i] = 0;
for ( int j = 0; j < i; j++)
catalan[i] += catalan[j] * catalan[i - j - 1];
}
return catalan[n];
}
int main()
{
for ( int i = 0; i < 10; i++)
cout << catalanDP(i) << " " ;
return 0;
}
|
Java
import java.io.*;
class GFG {
static int catalanDP( int n)
{
int catalan[] = new int [n + 2 ];
catalan[ 0 ] = 1 ;
catalan[ 1 ] = 1 ;
for ( int i = 2 ; i <= n; i++) {
catalan[i] = 0 ;
for ( int j = 0 ; j < i; j++) {
catalan[i]
+= catalan[j] * catalan[i - j - 1 ];
}
}
return catalan[n];
}
public static void main(String[] args)
{
for ( int i = 0 ; i < 10 ; i++) {
System.out.print(catalanDP(i) + " " );
}
}
}
|
Python3
def catalan(n):
if (n = = 0 or n = = 1 ):
return 1
catalan = [ 0 ] * (n + 1 )
catalan[ 0 ] = 1
catalan[ 1 ] = 1
for i in range ( 2 , n + 1 ):
for j in range (i):
catalan[i] + = catalan[j] * catalan[i - j - 1 ]
return catalan[n]
for i in range ( 10 ):
print (catalan(i), end = " " )
|
C#
using System;
class GFG {
static uint catalanDP( uint n)
{
uint [] catalan = new uint [n + 2];
catalan[0] = catalan[1] = 1;
for ( uint i = 2; i <= n; i++) {
catalan[i] = 0;
for ( uint j = 0; j < i; j++)
catalan[i]
+= catalan[j] * catalan[i - j - 1];
}
return catalan[n];
}
static void Main()
{
for ( uint i = 0; i < 10; i++)
Console.Write(catalanDP(i) + " " );
}
}
|
PHP
<?php
function catalanDP( $n )
{
$catalan = array ();
$catalan [0] = $catalan [1] = 1;
for ( $i = 2; $i <= $n ; $i ++)
{
$catalan [ $i ] = 0;
for ( $j = 0; $j < $i ; $j ++)
$catalan [ $i ] += $catalan [ $j ] *
$catalan [ $i - $j - 1];
}
return $catalan [ $n ];
}
for ( $i = 0; $i < 10; $i ++)
echo catalanDP( $i ) , " " ;
?>
|
Javascript
<script>
function catalanDP(n)
{
let catalan= [];
catalan[0] = catalan[1] = 1;
for (let i = 2; i <= n; i++)
{
catalan[i] = 0;
for (let j = 0; j < i; j++)
catalan[i] += catalan[j] *
catalan[i - j - 1];
}
return catalan[n];
}
for (let i = 0; i < 10; i++)
document.write(catalanDP(i) + " " );
</script>
|
Output1 1 2 5 14 42 132 429 1430 4862
Time Complexity: O(n2)
Auxiliary Space: O(n)
Binomial Coefficient Solution for Catalan number:
We can also use the below formula to find nth Catalan number in O(n) time.

Here is the proof for the Expression:–

This is the expression for which we are going to see the proof
In the pascal triangle,
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

Pascal’s triangle as binomial coefficients

the formula for a cell of Pascal’s triangle

Pascal’s triangle

.

.

.
Below are the steps for calculating nCr.
- Create a variable to store the answer and change r to n – r if r is greater than n – r because we know that C(n, r) = C(n, n-r) if r > n – r
- Run a loop from 0 to r-1
- In every iteration update ans as (ans*(n-i))/(i+1), where i is the loop counter.
- So the answer will be equal to ((n/1)*((n-1)/2)*…*((n-r+1)/r), which is equal to nCr.
Below are steps to calculate Catalan numbers using the formula: 2nCn/(n+1)
- Calculate 2nCn using the similar steps that we use to calculate nCr
- Return the value 2nCn/ (n + 1)\
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
unsigned long int binomialCoeff(unsigned int n,
unsigned int k)
{
unsigned long int res = 1;
if (k > n - k)
k = n - k;
for ( int i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
unsigned long int catalan(unsigned int n)
{
unsigned long int c = binomialCoeff(2 * n, n);
return c / (n + 1);
}
int main()
{
for ( int i = 0; i < 10; i++)
cout << catalan(i) << " " ;
return 0;
}
|
Java
class GFG {
static long binomialCoeff( int n, int k)
{
long res = 1 ;
if (k > n - k) {
k = n - k;
}
for ( int i = 0 ; i < k; ++i) {
res *= (n - i);
res /= (i + 1 );
}
return res;
}
static long catalan( int n)
{
long c = binomialCoeff( 2 * n, n);
return c / (n + 1 );
}
public static void main(String[] args)
{
for ( int i = 0 ; i < 10 ; i++) {
System.out.print(catalan(i) + " " );
}
}
}
|
Python3
def binomialCoefficient(n, k):
if (k > n - k):
k = n - k
res = 1
for i in range (k):
res = res * (n - i)
res = res / (i + 1 )
return res
def catalan(n):
c = binomialCoefficient( 2 * n, n)
return c / (n + 1 )
for i in range ( 10 ):
print (catalan(i), end = " " )
|
C#
using System;
class GFG {
static long binomialCoeff( int n, int k)
{
long res = 1;
if (k > n - k) {
k = n - k;
}
for ( int i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
static long catalan( int n)
{
long c = binomialCoeff(2 * n, n);
return c / (n + 1);
}
public static void Main()
{
for ( int i = 0; i < 10; i++) {
Console.Write(catalan(i) + " " );
}
}
}
|
PHP
<?php
function binomialCoeff( $n , $k )
{
$res = 1;
if ( $k > $n - $k )
$k = $n - $k ;
for ( $i = 0; $i < $k ; ++ $i )
{
$res *= ( $n - $i );
$res = floor ( $res / ( $i + 1));
}
return $res ;
}
function catalan( $n )
{
$c = binomialCoeff(2 * ( $n ), $n );
return floor ( $c / ( $n + 1));
}
for ( $i = 0; $i < 10; $i ++)
echo catalan( $i ), " " ;
?>
|
Javascript
<script>
function binomialCoeff(n, k)
{
let res = 1;
if (k > n - k)
k = n - k;
for (let i = 0; i < k; ++i)
{
res *= (n - i);
res = Math.floor(res / (i + 1));
}
return res;
}
function catalan(n)
{
c = binomialCoeff(2 * (n), n);
return Math.floor(c / (n + 1));
}
for (let i = 0; i < 10; i++)
document.write(catalan(i) + " " );
</script>
|
Output1 1 2 5 14 42 132 429 1430 4862
Time Complexity: O(n).
Auxiliary Space: O(1)
We can also use the below formulas to find nth Catalan number in O(n) time.


Catalan number using the multi-Precision library:
In this method, we have used a boost multi-precision library, and the motive behind its use is just only to have precision meanwhile finding the large Catalan number and a generalized technique using for loop to calculate Catalan numbers.
Pseudocode:
a) initially set cat_=1 and print it
b) run a for loop i=1 to i<=n
cat_ *= (4*i-2)
cat_ /= (i+1)
print cat_
c) end loop and exit
Below is the implementation using the multi-precision library:
C++
#include <bits/stdc++.h>
#include <boost/multiprecision/cpp_int.hpp>
using boost::multiprecision::cpp_int;
using namespace std;
void catalan( int n)
{
cpp_int cat_ = 1;
cout << cat_ << " " ;
for (cpp_int i = 1; i <= n; i++) {
cat_ *= (4 * i - 2);
cat_ /= (i + 1);
cout << cat_ << " " ;
}
}
int main()
{
int n = 5;
catalan(n);
return 0;
}
|
Java
import java.util.*;
class GFG {
static void catalan( int n)
{
int cat_ = 1 ;
System.out.print(cat_ + " " );
for ( int i = 1 ; i < n; i++) {
cat_ *= ( 4 * i - 2 );
cat_ /= (i + 1 );
System.out.print(cat_ + " " );
}
}
public static void main(String args[])
{
int n = 5 ;
catalan(n);
}
}
|
Python3
def catalan(n):
cat_ = 1
print (cat_, " " , end = '')
for i in range ( 1 , n):
cat_ * = ( 4 * i - 2 )
cat_ / / = (i + 1 )
print (cat_, " " , end = '')
n = 5
catalan(n)
|
C#
using System;
public class GFG {
static void catalan( int n)
{
int cat_ = 1;
Console.Write(cat_ + " " );
for ( int i = 1; i < n; i++) {
cat_ *= (4 * i - 2);
cat_ /= (i + 1);
Console.Write(cat_ + " " );
}
}
public static void Main(String[] args)
{
int n = 5;
catalan(n);
}
}
|
Javascript
<script>
function catalan(n)
{
let cat_ = 1;
document.write(cat_ + " " );
for (let i = 1; i < n; i++)
{
cat_ *= (4 * i - 2);
cat_ /= (i + 1);
document.write(cat_ + " " );
}
}
let n = 5;
catalan(n);
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1), since no extra space has been taken.
Catalan number using BigInteger in java:
Finding values of Catalan numbers for N>80 is not possible even by using long in java, so we use BigInteger.
Follow the steps below for the implementation:
- Create a BigInteger variable b and initialize it to 1.
- Calculate n! and store it into b.
- Calculate n! * n! and store into b.
- Create another BigInteger variable d and initialize it to 1.
- Calculate 2n! and store into d.
- Calculate (2n)! / (n! * n!) into ans
- Calculate ans / (n + 1) and return ans.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define bigint long long int
bigint findCatalan( int n)
{
bigint b = 1;
for ( int i = 1; i <= n; i++) {
b = b * i;
}
b = b * b;
bigint d = 1;
for ( int i = 1; i <= 2 * n; i++) {
d = d * i;
}
bigint ans = d / b;
ans = ans / (n + 1);
return ans;
}
int main() {
int n = 5;
cout << findCatalan(n);
}
|
Java
import java.io.*;
import java.math.*;
import java.util.*;
class GFG {
public static BigInteger findCatalan( int n)
{
BigInteger b = new BigInteger( "1" );
for ( int i = 1 ; i <= n; i++) {
b = b.multiply(BigInteger.valueOf(i));
}
b = b.multiply(b);
BigInteger d = new BigInteger( "1" );
for ( int i = 1 ; i <= 2 * n; i++) {
d = d.multiply(BigInteger.valueOf(i));
}
BigInteger ans = d.divide(b);
ans = ans.divide(BigInteger.valueOf(n + 1 ));
return ans;
}
public static void main(String[] args)
{
int n = 5 ;
System.out.println(findCatalan(n));
}
}
|
Python3
def findCatalan(n):
b = 1
for i in range ( 1 , n + 1 , 1 ):
b = b * i
b = b * b
d = 1
for i in range ( 1 , 2 * n + 1 , 1 ):
d = d * i
ans = d / b
ans = ans / (n + 1 )
return ans
n = 50
print ( int (findCatalan(n)))
|
C#
using System;
using System.Numerics;
class GFG {
public static BigInteger findCatalan( int n)
{
BigInteger b = new BigInteger(1);
for ( int i = 1; i <= n; i++) {
b = BigInteger.Multiply(b, new BigInteger(i));
}
b = BigInteger.Multiply(b, b);
BigInteger d = new BigInteger(1);
for ( int i = 1; i <= 2 * n; i++) {
d = BigInteger.Multiply(d, new BigInteger(i));
}
BigInteger ans = BigInteger.Divide(d, b);
ans = BigInteger.Divide(ans, new BigInteger(n + 1));
return ans;
}
public static void Main( string [] args)
{
int n = 5;
Console.WriteLine(findCatalan(n));
}
}
|
Javascript
function findCatalan(n){
let b = 1
for (let i = 1; i <= n; i++){
b = b * i;
}
b = b * b;
let d = 1;
for (let i = 1; i <= 2 * n; i++){
d = d * i
}
let ans = d/b;
ans = ans / (n + 1);
return ans;
}
let n = 5;
console.log(findCatalan(n));
|
Time Complexity: O(n)
Auxiliary Space: O(1), since no extra space has been taken.