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.
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.
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 program to test above function 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; } 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 Program to test above function 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; } 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 ?> |
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 .
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 program to test above function 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 |
Python
# 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[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 Aditi Sharma |
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. ?> |
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++
// 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 program to test above functions 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 program to test above function 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 ) 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 program to test above function 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 ?> |
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.
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
Recommended Posts:
- Program for nth Fuss–Catalan Number
- Total number of possible Binary Search Trees using Catalan Number
- Applications of Catalan Numbers
- Minimum changes required to make a Catalan Sequence
- Program to calculate the number of odd days in given number of years
- Program to Convert Octal Number to Binary Number
- Program to check whether a number is Proth number or not
- Program for n-th even number
- Program for n-th odd number
- Program for factorial of a number
- Program to find the Hidden Number
- Program to find the number from given holes
- C program to find Decagonal Number
- C++ program to divide a number by 3 without using *, / , +, -, % operators
- Program to find Cullen Number