Program for nth Catalan Number

07 Jul, 2022
Catalan numbers are a sequence of natural numbers that occurs in many interesting counting problems like following.
Count the number of expressions containing n pairs of parentheses which 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.
Count the number of expressions containing n pairs of parentheses which 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. 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. 
Following is the implementation of above recursive formula.  
Chapters
descriptions off, selected
captions settings, opens captions settings dialog
captions off, selected
English
This is a modal window.
Beginning of dialog window. Escape will cancel and close the window.
End of dialog window.
C++
Java
Python3
C#
PHP
Javascript
#include <iostream>using namespace std; // A recursive function to find nth catalan numberunsigned 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 codeint main(){    for (int i = 0; i < 10; i++)        cout << catalan(i) << " ";    return 0;}
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) + " ");        }    }}
# A recursive function to# find nth catalan numberdef 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 Codefor i in range(10):    print (catalan(i),end=" ")# This code is contributed by# Nikhil Kumar Singh (nickzuck_007)
// A recursive C# program to find// nth catalan numberusing 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 Program for nth// Catalan Number // A recursive function to// find nth catalan numberfunction 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 Codefor ($i = 0; $i < 10; $i++)    echo catalan($i), " "; // This code is contributed aj_36?>
<script> // Javascript Program for nth// Catalan Number // A recursive function to// find nth catalan numberfunction 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 Codefor (let i = 0; i < 10; i++)    document.write(catalan(i) + " "); // This code is contributed _saurabh_jaiswal </script>
1 1 2 5 14 42 132 429 1430 4862 
Time complexity of above implementation is equivalent to nth catalan number. 
 
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++
Java
Python3
C#
PHP
Javascript
#include <iostream>using namespace std; // A dynamic programming based function to find nth// Catalan numberunsigned 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 codeint main(){    for (int i = 0; i < 10; i++)        cout << catalanDP(i) << " ";    return 0;}
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
# 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 codefor i in range(10):    print(catalan(i), end=" ")# This code is contributed by Ediga_manisha
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 program for nth Catalan Number // A dynamic programming based function// to find nth Catalan numberfunction 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.?>
<script>// Javascript program for nth Catalan Number // A dynamic programming based function// to find nth Catalan numberfunction 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>
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. 
 We have discussed a O(n) approach to find binomial coefficient nCr. 
C++
Java
Python3
C#
PHP
Javascript
// 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) timeunsigned 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 codeint main(){    for (int i = 0; i < 10; i++)        cout << catalan(i) << " ";    return 0;}
// 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) + " ");        }    }}
# 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 Codefor i in range(10):    print(catalan(i), end=" ") # This code is contributed by Aditi Sharma
// C# program for nth Catalan Numberusing 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 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) timefunction catalan($n){    // Calculate value of 2nCn    $c = binomialCoeff(2 * ($n), $n);     // return 2nCn/(n+1)    return floor($c / ($n + 1));} // Driver codefor ($i = 0; $i < 10; $i++)echo catalan($i), " " ; // This code is contributed by Ryuga?>
<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) timefunction catalan(n){     // Calculate value of 2nCn    c = binomialCoeff(2 * (n), n);     // return 2nCn/(n+1)    return Math.floor(c / (n + 1));} // Driver codefor (let i = 0; i < 10; i++)document.write(catalan(i) + " " ); // This code is contributed by _saurabh_jaiswal</script>
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. 
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=2cat_ = cat_ / (i+1)=2/2 = 1      
For i = 2; cat_ = cat_ * (4*2-2)=1*6=6cat_ = cat_ / (i+1)=6/3=2  
For i = 3 :-      cat_ = cat_ * (4*3-2)=2*10=20cat_ = 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++
Java
Python3
C#
Javascript
#include <bits/stdc++.h>#include <boost/multiprecision/cpp_int.hpp>using boost::multiprecision::cpp_int;using namespace std; // Function to print the numbervoid 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 codeint main(){    int n = 5;     // Function call    catalan(n);    return 0;}
import java.util.*;class GFG{   // Function to print the numberstatic 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 codepublic static void main(String args[]){    int n = 5;     // Function call    catalan(n);}} // This code is contributed by Debojyoti Mandal
# Function to print the numberdef 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 coden = 5 # Function callcatalan(n) # This code is contributed by rohan07
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
<script> // Function to print the numberfunction 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>
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
C#
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# code to implement the approachusing 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.
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 
 
icr0
jit_t
nitin mittal
vt_m
soumya7
29AjayKumar
Harshit Singhal 2
ankthon
Akanksha_Rai
Chandan_Kumar
Rajput-Ji
anantiitrk
ankit_deshmukh
madhav_mohan
RohitOberoi
manishaediga23
jyoti369
_saurabh_jaiswal
mayanktyagi1709
rohan07
bunnyram19
manishku12j
amartyaghoshgfg
prasanna1995
07prashantsgh
Amazon
catalan
series
Dynamic Programming
Mathematical
Misc
Amazon
Misc
Dynamic Programming
Mathematical
Misc
series
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Largest Sum Contiguous Subarray
Program for Fibonacci numbers
0-1 Knapsack Problem | DP-10
Longest Common Subsequence | DP-4
Subset Sum Problem | DP-25
Program for Fibonacci numbers
Set in C++ Standard Template Library (STL)
Write a program to print all permutations of a given string
C++ Data Types
Merge two sorted arrays