Skip to content
Related Articles

Related Articles

Program for nth Catalan Number

View Discussion
Improve Article
Save Article
  • Difficulty Level : Medium
  • Last Updated : 18 Jul, 2022
View Discussion
Improve Article
Save Article

Catalan numbers are a sequence of natural numbers that occurs in many interesting counting problems like following.

  1. Count the number of expressions containing n pairs of parentheses which are correctly matched. For n = 3, possible expressions are ((())), ()(()), ()()(), (())(), (()()).
  2. Count the number of possible Binary Search Trees with n keys (See this)
  3. 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.
  4. 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. 
The first few Catalan numbers for n = 0, 1, 2, 3, … are 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, …  

Recursive Solution 
Catalan numbers satisfy the following recursive formula. 

C_0=1 \ and \ C_{n+1}=\sum_{i=0}^{n}C_iC_{n-i} \ for \ n\geq 0

Following is the implementation of above recursive formula.  

C++




#include <iostream>
using namespace std;
 
// A recursive function to find nth catalan number
unsigned long int catalan(unsigned int n)
{
    // Base case
    if (n <= 1)
        return 1;
 
    // catalan(n) is sum of
    // catalan(i)*catalan(n-i-1)
    unsigned long int res = 0;
    for (int i = 0; i < n; i++)
        res += catalan(i)
            * catalan(n - i - 1);
 
    return res;
}
 
// Driver code
int main()
{
    for (int i = 0; i < 10; i++)
        cout << catalan(i) << " ";
    return 0;
}

Java




class CatalnNumber {
 
    // A recursive function to find nth catalan number
 
    int catalan(int n)
    {
        int res = 0;
 
        // Base case
        if (n <= 1)
        {
            return 1;
        }
        for (int i = 0; i < n; i++)
        {
            res += catalan(i)
                * catalan(n - i - 1);
        }
        return res;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        CatalnNumber cn = new CatalnNumber();
        for (int i = 0; i < 10; i++)
        {
            System.out.print(cn.catalan(i) + " ");
        }
    }
}

Python3




# A recursive function to
# find nth catalan number
def catalan(n):
    # Base Case
    if n <= 1:
        return 1
 
    # Catalan(n) is the sum
    # of catalan(i)*catalan(n-i-1)
    res = 0
    for i in range(n):
        res += catalan(i) * catalan(n-i-1)
 
    return res
 
 
# Driver Code
for i in range(10):
    print (catalan(i),end=" ")
# This code is contributed by
# Nikhil Kumar Singh (nickzuck_007)

C#




// A recursive C# program to find
// nth catalan number
using System;
 
class GFG {
 
    // A recursive function to find
    // nth catalan number
    static int catalan(int n)
    {
        int res = 0;
 
        // Base case
        if (n <= 1)
        {
            return 1;
        }
        for (int i = 0; i < n; i++)
        {
            res += catalan(i)
                * catalan(n - i - 1);
        }
        return res;
    }
 
    // Driver Code
    public static void Main()
    {
        for (int i = 0; i < 10; i++)
            Console.Write(catalan(i) + " ");
    }
}
 
// This code is contributed by
// nitin mittal.

PHP




<?php
// PHP Program for nth
// Catalan Number
 
// A recursive function to
// find nth catalan number
function catalan($n)
{
     
    // Base case
    if ($n <= 1)
        return 1;
 
    // catalan(n) is sum of
    // catalan(i)*catalan(n-i-1)
    $res = 0;
    for($i = 0; $i < $n; $i++)
        $res += catalan($i) *
                catalan($n - $i - 1);
 
    return $res;
}
 
// Driver Code
for ($i = 0; $i < 10; $i++)
    echo catalan($i), " ";
 
// This code is contributed aj_36
?>

Javascript




<script>
 
// Javascript Program for nth
// Catalan Number
 
// A recursive function to
// find nth catalan number
function catalan(n)
{
     
    // Base case
    if (n <= 1)
        return 1;
 
    // catalan(n) is sum of
    // catalan(i)*catalan(n-i-1)
    let res = 0;
    for(let i = 0; i < n; i++)
        res += catalan(i) *
                catalan(n - i - 1);
 
    return res;
}
 
// Driver Code
for (let i = 0; i < 10; i++)
    document.write(catalan(i) + " ");
 
// This code is contributed _saurabh_jaiswal
 
</script>

Output

1 1 2 5 14 42 132 429 1430 4862 

Time complexity of above implementation is equivalent to nth catalan number. 

T(n)=\sum_{i=0}^{n-1}T(i)*T(n-i-1) \ for \ n\geq 1;                                      

The value of nth catalan number is exponential that makes the time complexity exponential.

Dynamic Programming Solution : We can observe that the above recursive implementation does a lot of repeated work (we can the same by drawing recursion tree). Since there are overlapping subproblems, we can use dynamic programming for this. Following is a Dynamic programming based implementation .

C++




#include <iostream>
using namespace std;
 
// A dynamic programming based function to find nth
// Catalan number
unsigned long int catalanDP(unsigned int n)
{
    // Table to store results of subproblems
    unsigned long int catalan[n + 1];
 
    // Initialize first two values in table
    catalan[0] = catalan[1] = 1;
 
    // Fill entries in catalan[] using recursive formula
    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 last entry
    return catalan[n];
}
 
// Driver code
int main()
{
    for (int i = 0; i < 10; i++)
        cout << catalanDP(i) << " ";
    return 0;
}

Java




class GFG {
 
    // A dynamic programming based function to find nth
    // Catalan number
    static int catalanDP(int n)
    {
        // Table to store results of subproblems
        int catalan[] = new int[n + 2];
 
        // Initialize first two values in table
        catalan[0] = 1;
        catalan[1] = 1;
 
        // Fill entries in catalan[]
        // using recursive formula
        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 last entry
        return catalan[n];
    }
 
    // Driver code
    public static void main(String[] args)
    {
        for (int i = 0; i < 10; i++) {
            System.out.print(catalanDP(i) + " ");
        }
    }
}
// This code contributed by Rajput-Ji

Python3




# A dynamic programming based function to find nth
# Catalan number
 
 
def catalan(n):
    if (n == 0 or n == 1):
        return 1
 
    # Table to store results of subproblems
    catalan =[0]*(n+1)
 
    # Initialize first two values in table
    catalan[0] = 1
    catalan[1] = 1
 
    # Fill entries in catalan[]
    # using recursive formula
    for i in range(2, n + 1):
        for j in range(i):
            catalan[i] += catalan[j]* catalan[i-j-1]
 
    # Return last entry
    return catalan[n]
 
 
# Driver code
for i in range(10):
    print(catalan(i), end=" ")
# This code is contributed by Ediga_manisha

C#




using System;
 
class GFG {
 
    // A dynamic programming based
    // function to find nth
    // Catalan number
    static uint catalanDP(uint n)
    {
        // Table to store results of subproblems
        uint[] catalan = new uint[n + 2];
 
        // Initialize first two values in table
        catalan[0] = catalan[1] = 1;
 
        // Fill entries in catalan[]
        // using recursive formula
        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 last entry
        return catalan[n];
    }
 
    // Driver code
    static void Main()
    {
        for (uint i = 0; i < 10; i++)
            Console.Write(catalanDP(i) + " ");
    }
}
 
// This code is contributed by Chandan_jnu

PHP




<?php
// PHP program for nth Catalan Number
 
// A dynamic programming based function
// to find nth Catalan number
function catalanDP( $n)
{
     
    // Table to store results
    // of subproblems
    $catalan= array();
 
    // Initialize first two
    // values in table
    $catalan[0] = $catalan[1] = 1;
 
    // Fill entries in catalan[]
    // using recursive formula
    for ($i = 2; $i <= $n; $i++)
    {
        $catalan[$i] = 0;
        for ( $j = 0; $j < $i; $j++)
            $catalan[$i] += $catalan[$j] *
                   $catalan[$i - $j - 1];
    }
 
    // Return last entry
    return $catalan[$n];
}
 
    // Driver Code
    for ($i = 0; $i < 10; $i++)
        echo catalanDP($i) , " ";
 
// This code is contributed anuj_67.
?>

Javascript




<script>
// Javascript program for nth Catalan Number
 
// A dynamic programming based function
// to find nth Catalan number
function catalanDP(n)
{
     
    // Table to store results
    // of subproblems
    let catalan= [];
 
    // Initialize first two
    // values in table
    catalan[0] = catalan[1] = 1;
 
    // Fill entries in catalan[]
    // using recursive formula
    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 last entry
    return catalan[n];
}
 
    // Driver Code
    for (let i = 0; i < 10; i++)
        document.write(catalanDP(i) + " ");
 
// This code is contributed _saurabh_jaiswal
</script>

Output

1 1 2 5 14 42 132 429 1430 4862 

Time Complexity: Time complexity of above implementation is O(n2)

Using Binomial Coefficient 
We can also use the below formula to find nth Catalan number in O(n) time. 

C_n=\frac{1}{n+1}\binom{2n}{n}
 
We have discussed a O(n) approach to find binomial coefficient nCr

C++




// C++ program for nth Catalan Number
#include <iostream>
using namespace std;
 
// Returns value of Binomial Coefficient C(n, k)
unsigned long int binomialCoeff(unsigned int n,
                                unsigned int k)
{
    unsigned long int res = 1;
 
    // Since C(n, k) = C(n, n-k)
    if (k > n - k)
        k = n - k;
 
    // Calculate value of [n*(n-1)*---*(n-k+1)] /
    // [k*(k-1)*---*1]
    for (int i = 0; i < k; ++i) {
        res *= (n - i);
        res /= (i + 1);
    }
 
    return res;
}
 
// A Binomial coefficient based function to find nth catalan
// number in O(n) time
unsigned long int catalan(unsigned int n)
{
    // Calculate value of 2nCn
    unsigned long int c = binomialCoeff(2 * n, n);
 
    // return 2nCn/(n+1)
    return c / (n + 1);
}
 
// Driver code
int main()
{
    for (int i = 0; i < 10; i++)
        cout << catalan(i) << " ";
    return 0;
}

Java




// Java program for nth Catalan Number
 
class GFG {
 
    // Returns value of Binomial Coefficient C(n, k)
    static long binomialCoeff(int n, int k)
    {
        long res = 1;
 
        // Since C(n, k) = C(n, n-k)
        if (k > n - k) {
            k = n - k;
        }
 
        // Calculate value of [n*(n-1)*---*(n-k+1)] /
        // [k*(k-1)*---*1]
        for (int i = 0; i < k; ++i) {
            res *= (n - i);
            res /= (i + 1);
        }
 
        return res;
    }
 
    // A Binomial coefficient based function
    //  to find nth catalan number in O(n) time
    static long catalan(int n)
    {
        // Calculate value of 2nCn
        long c = binomialCoeff(2 * n, n);
 
        // return 2nCn/(n+1)
        return c / (n + 1);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        for (int i = 0; i < 10; i++) {
            System.out.print(catalan(i) + " ");
        }
    }
}

Python3




# Python program for nth Catalan Number
# Returns value of Binomial Coefficient C(n, k)
 
 
def binomialCoefficient(n, k):
 
    # since C(n, k) = C(n, n - k)
    if (k > n - k):
        k = n - k
 
    # initialize result
    res = 1
 
    # Calculate value of [n * (n-1) *---* (n-k + 1)]
    # / [k * (k-1) *----* 1]
    for i in range(k):
        res = res * (n - i)
        res = res / (i + 1)
    return res
 
# A Binomial coefficient based function to
# find nth catalan number in O(n) time
 
 
def catalan(n):
    c = binomialCoefficient(2*n, n)
    return c/(n + 1)
 
# Driver Code
for i in range(10):
    print(catalan(i), end=" ")
 
# This code is contributed by Aditi Sharma

C#




// C# program for nth Catalan Number
using System;
class GFG {
 
    // Returns value of Binomial Coefficient C(n, k)
    static long binomialCoeff(int n, int k)
    {
        long res = 1;
 
        // Since C(n, k) = C(n, n-k)
        if (k > n - k) {
            k = n - k;
        }
 
        // Calculate value of [n*(n-1)*---*(n-k+1)] /
        // [k*(k-1)*---*1]
        for (int i = 0; i < k; ++i) {
            res *= (n - i);
            res /= (i + 1);
        }
 
        return res;
    }
 
    // A Binomial coefficient based function to find nth
    // catalan number in O(n) time
    static long catalan(int n)
    {
        // Calculate value of 2nCn
        long c = binomialCoeff(2 * n, n);
 
        // return 2nCn/(n+1)
        return c / (n + 1);
    }
 
    // Driver code
    public static void Main()
    {
        for (int i = 0; i < 10; i++) {
            Console.Write(catalan(i) + " ");
        }
    }
}
 
// This code is contributed
// by Akanksha Rai

PHP




<?php
// PHP program for nth Catalan Number
 
// Returns value of Binomial
// Coefficient C(n, k)
function binomialCoeff($n, $k)
{
    $res = 1;
 
    // Since C(n, k) = C(n, n-k)
    if ($k > $n - $k)
        $k = $n - $k;
 
    // Calculate value of [n*(n-1)*---*(n-k+1)] /
    //                    [k*(k-1)*---*1]
    for ($i = 0; $i < $k; ++$i)
    {
        $res *= ($n - $i);
        $res = floor($res / ($i + 1));
    }
 
    return $res;
}
 
// A Binomial coefficient based function
// to find nth catalan number in O(n) time
function catalan($n)
{
    // Calculate value of 2nCn
    $c = binomialCoeff(2 * ($n), $n);
 
    // return 2nCn/(n+1)
    return floor($c / ($n + 1));
}
 
// Driver code
for ($i = 0; $i < 10; $i++)
echo catalan($i), " " ;
 
// This code is contributed by Ryuga
?>

Javascript




<script>
// Javascript program for nth Catalan Number
 
// Returns value of Binomial
// Coefficient C(n, k)
function binomialCoeff(n, k)
{
    let res = 1;
 
    // Since C(n, k) = C(n, n-k)
    if (k > n - k)
        k = n - k;
 
    // Calculate value of [n*(n-1)*---*(n-k+1)] /
    //                    [k*(k-1)*---*1]
    for (let i = 0; i < k; ++i)
    {
        res *= (n - i);
        res = Math.floor(res / (i + 1));
    }
 
    return res;
}
 
// A Binomial coefficient based function
// to find nth catalan number in O(n) time
function catalan(n)
{
 
    // Calculate value of 2nCn
    c = binomialCoeff(2 * (n), n);
 
    // return 2nCn/(n+1)
    return Math.floor(c / (n + 1));
}
 
// Driver code
for (let i = 0; i < 10; i++)
document.write(catalan(i) + " " );
 
// This code is contributed by _saurabh_jaiswal
</script>

Output

1 1 2 5 14 42 132 429 1430 4862 

Time Complexity: Time complexity of above implementation is O(n).
We can also use below formulas to find nth catalan number in O(n) time. 

C_n=\frac{(2n)!}{(n+1)!n!}=\prod_{k=2}^{n}\frac{n+k}{k} \ for \ n\geq 0

C_n = \frac{2(2n-1)}{n+1}*C_{n-1} \ \ \  {|} \ \ {n>0}

Use multi-precision library:  In this method, we have used boost multi-precision library, and the motive behind its use is just only to have precision meanwhile finding the large CATALAN’s number and a generalized technique using for loop to calculate Catalan numbers .  

For example: N = 5

Initially set cat_=1 then, print cat_  ,

then, iterate from i = 1 to i < 5

for i = 1; cat_ = cat_ * (4*1-2)=1*2=2
cat_ = cat_ / (i+1)=2/2 = 1      

For i = 2; cat_ = cat_ * (4*2-2)=1*6=6
cat_ = cat_ / (i+1)=6/3=2  

For i = 3 :-      cat_ = cat_ * (4*3-2)=2*10=20
cat_ = cat_ / (i+1)=20/4=5   

For i = 4 :-      cat_ = cat_ * (4*4-2)=5*14=70
 cat_ = cat_ / (i+1)=70/5=14     

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        

C++




#include <bits/stdc++.h>
#include <boost/multiprecision/cpp_int.hpp>
using boost::multiprecision::cpp_int;
using namespace std;
 
// Function to print the number
void catalan(int n)
{
    cpp_int cat_ = 1;
 
    // For the first number
    cout << cat_ << " "; // C(0)
 
    // Iterate till N
    for (cpp_int i = 1; i <=n; i++)
    {
        // Calculate the number
        // and print it
        cat_ *= (4 * i - 2);
        cat_ /= (i + 1);
        cout << cat_ << " ";
    }
}
 
// Driver code
int main()
{
    int n = 5;
 
    // Function call
    catalan(n);
    return 0;
}

Java




import java.util.*;
class GFG
{
   
// Function to print the number
static void catalan(int n)
{
    int cat_ = 1;
 
    // For the first number
    System.out.print(cat_+" "); // C(0)
 
    // Iterate till N
    for (int i = 1; i < n; i++)
    {
        // Calculate the number
        // and print it
        cat_ *= (4 * i - 2);
        cat_ /= (i + 1);
        System.out.print(cat_+" ");
    }
}
 
// Driver code
public static void main(String args[])
{
    int n = 5;
 
    // Function call
    catalan(n);
}
}
 
// This code is contributed by Debojyoti Mandal

Python3




# Function to print the number
def catalan(n):
     
    cat_ = 1
 
    # For the first number
    print(cat_, " ", end = '')# C(0)
 
    # Iterate till N
    for i in range(1, n):
         
        # Calculate the number
        # and print it
        cat_ *= (4 * i - 2);
        cat_ //= (i + 1);
        print(cat_, " ", end = '')
 
# Driver code
n = 5
 
# Function call
catalan(n)
 
# This code is contributed by rohan07

C#




using System;
 
public class GFG {
 
    // Function to print the number
    static void catalan(int n) {
        int cat_ = 1;
 
        // For the first number
        Console.Write(cat_ + " "); // C(0)
 
        // Iterate till N
        for (int i = 1; i < n; i++) {
            // Calculate the number
            // and print it
            cat_ *= (4 * i - 2);
            cat_ /= (i + 1);
            Console.Write(cat_ + " ");
        }
    }
 
    // Driver code
    public static void Main(String []args) {
        int n = 5;
 
        // Function call
        catalan(n);
    }
}
 
// This code is contributed by Rajput-Ji

Javascript




<script>
 
// Function to print the number
function catalan(n)
{
    let cat_ = 1;
 
    // For the first number
    document.write(cat_ + " "); // C(0)
 
    // Iterate till N
    for (let i = 1; i < n; i++)
    {
        // Calculate the number
        // and print it
        cat_ *= (4 * i - 2);
        cat_ /= (i + 1);
        document.write(cat_ + " ");
    }
}
 
// Driver code
    let n = 5;
 
    // Function call
    catalan(n);
 
//This code is contributed by Mayank Tyagi
</script>

Output

1 1 2 5 14 

Time Complexity: O(n)
Auxiliary Space: O(1), since no extra space has been taken.

Another solution 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
  • Here we find solution using Binomial Coefficient method as discussed above

Java




import java.io.*;
import java.util.*;
import java.math.*;
 
class GFG
{
    public static BigInteger findCatalan(int n)
    {
        // using BigInteger to calculate large factorials
        BigInteger b = new BigInteger("1");
 
        // calculating n!
        for (int i = 1; i <= n; i++) {
            b = b.multiply(BigInteger.valueOf(i));
        }
 
        // calculating n! * n!
        b = b.multiply(b);
 
        BigInteger d = new BigInteger("1");
 
        // calculating (2n)!
        for (int i = 1; i <= 2 * n; i++) {
            d = d.multiply(BigInteger.valueOf(i));
        }
 
        // calculating (2n)! / (n! * n!)
        BigInteger ans = d.divide(b);
 
        // calculating (2n)! / ((n! * n!) * (n+1))
        ans = ans.divide(BigInteger.valueOf(n + 1));
        return ans;
    }
   
    // Driver Code
    public static void main(String[] args)
    {
        int n = 5;
        System.out.println(findCatalan(n));
    }
}
// Contributed by Rohit Oberoi

C#




// C# code to implement the approach
using System;
using System.Numerics;
 
class GFG {
  public static BigInteger findCatalan(int n)
  {
    // using BigInteger to calculate large factorials
    BigInteger b = new BigInteger(1);
 
    // calculating n!
    for (int i = 1; i <= n; i++) {
      b = BigInteger.Multiply(b, new BigInteger(i));
    }
 
    // calculating n! * n!
    b = BigInteger.Multiply(b, b);
 
    BigInteger d = new BigInteger(1);
 
    // calculating (2n)!
    for (int i = 1; i <= 2 * n; i++) {
      d = BigInteger.Multiply(d, new BigInteger(i));
    }
 
    // calculating (2n)! / (n! * n!)
    BigInteger ans = BigInteger.Divide(d, b);
 
    // calculating (2n)! / ((n! * n!) * (n+1))
    ans = BigInteger.Divide(ans, new BigInteger(n + 1));
    return ans;
  }
 
  // Driver Code
  public static void Main(string[] args)
  {
    int n = 5;
    Console.WriteLine(findCatalan(n));
  }
}
 
// This code is contributed by phasing17.

Output

42

Time Complexity: O(n)
Auxiliary Space: O(1), since no extra space has been taken.
 

 
 

References: 
http://en.wikipedia.org/wiki/Catalan_number 
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
 

 


My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!