# Program for nth Catalan Number

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.

Following is the implementation of above recursive formula.

 #include  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;  }

 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 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)

 // 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.

 

Output

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 .

 #include  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;  }

 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 for i in range(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):          catalan[i] = 0         for j in range(i):              catalan[i] += catalan[j]               catalan[i] *= 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 Aditi Sharma

 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

 

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.

We have discussed a O(n) approach to find binomial coefficient nCr

 // C++ program for nth Catalan Number  #include  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 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 Code  for i in range(10):      print(catalan(i), end=" ")     # This code is contributed by Aditi Sharma

 // 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

  $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  ?>

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.

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

 #include  #include  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;  }

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
 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