Skip to content
Related Articles

Related Articles

Improve Article
Save Article
Like Article

Program for nth Catalan Number

  • Difficulty Level : Medium
  • Last Updated : 27 Oct, 2021

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) + " ");
        }
    }
}

Python

# 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),
# 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 formula 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

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)

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
Output

42

 

 
 

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!