📜  第 n 个加泰罗尼亚数字的Python程序

📅  最后修改于: 2022-05-13 01:56:56.719000             🧑  作者: Mango

第 n 个加泰罗尼亚数字的Python程序

加泰罗尼亚数是一系列自然数,出现在许多有趣的计数问题中,如下所示。

1)计算包含正确匹配的 n 对括号的表达式的数量。对于 n = 3,可能的表达式是 ((()))、()(())、()()()、(())()、(()())。

2)用n个键计算可能的二叉搜索树的数量(参见this)

有关更多应用,请参阅此内容。

n = 0, 1, 2, 3, … 的前几个加泰罗尼亚数是1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, …

递归解决方案

加泰罗尼亚数字满足以下递归公式。
C_0=1 \ and \ C_n_+_1=\sum_{i=0}^{n}C_iC_n_-_i \ for \ n\geq 0;

以下是上述递归公式的实现。

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 Program to test above function
for i in range(10):
    print(catalan(i), end=' ')


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 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-j-1]
 
    # Return last entry
    return catalan[n]
 
 
# Driver code
for i in range(10):
    print(catalan(i))


输出:
1 1 2 5 14 42 132 429 1430 4862

动态规划解决方案

我们可以观察到上面的递归实现做了很多重复的工作(我们可以通过绘制递归树来做同样的事情)。由于存在重叠的子问题,我们可以为此使用动态规划。以下是Python中基于动态编程的实现。

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 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-j-1]
 
    # Return last entry
    return catalan[n]
 
 
# Driver code
for i in range(10):
    print(catalan(i))
输出:
1
1
2
5
14
42
132
429
1430
4862

有关更多详细信息,请参阅关于第 n 个加泰罗尼亚语号码计划的完整文章!