如何使用加泰罗尼亚语数字找到正确匹配的括号数量



我有一项任务,要查找包含n个正确匹配的括号的表达式的数量。所以,我决定用加泰罗尼亚语数字。这是一个python代码。

from decimal import Decimal
n = int(input())
res = Decimal(1)
k = n//2
for i in range(1,  k+1):
res = Decimal(res*(n-k+i)/i)
res = int(res)
print(int(res//(k+1)))

在测试系统中测试后,我只有2个100的正确答案。当:n = 2(答案:1(和n = 4(答案:2(。我无法查看其他测试示例。你能帮帮我吗?我哪里错了?

由于C(2n,n(的值总是一个整数,并且只能使用整数中间结果进行计算,因此您可以使用整数算法,而不会遇到任何数字表示问题:

def catalan(n):
c = 1
for p in range(n+1,2*n+1):
c = c * p // (p-n)
return c // (n+1)
for n in range(10): print(catalan(n))

1
1
2
5
14
42
132
429
1430
4862       

这是基于以下加泰罗尼亚数字的定义:https://en.wikipedia.org/wiki/Catalan_number

Python 3.8现在在数学模块中有一个组合函数,这将使这变得更加容易:

def catalan(n): return math.comb(2*n,n)//(n+1)

对于以前版本的Python,您可以制作自己的comb((函数:

def comb(n,r):
if n-r > r: return comb(n,n-r)
result = 1
for i in range(r+1,n+1):
result = result * i // (i-r)
return result

注意,上面的第一个catalan函数使用了这个的精简版本

我不确定您的加泰罗尼亚公式是从哪里得到的,也不确定您为什么认为这与查找圆括号有关,也不知道您为什么使用Decimal类型。以下程序打印第N个加泰罗尼亚语号码:

n = int(input())
res = 1
for k in range(2,n+1):
res = res * (n+k) / k
print( int(res) )

您可能正在尝试使用十进制数,因为您知道浮点运算已经失败。不幸的是,由于同样的根本原因,十进制算术也被破坏了:如果缩减分数的分母只包含在该分子系统中除以10的因子,那么有理数只能被精确地表示。

在基数2(公共浮点(中,只能表示1/2**n个分数,因此0.2(1/5(只能表示为近似值。但在基数10中,0.1确实可以表示,但1/3是无穷大的0.3333……这将是有限计算机中的近似值。

当你使用有理数时,通过构造最终会给出整数值,你有两个可能的路径:

  • 有效但复杂的路径:由于结果将是整数,因此必须存在仅使用整数作为中间结果的计算路径。如果你使用该路径,你只使用整数算法,不会出现近似误差
  • 使用CCD_ 6:a Fraction的直接鲁棒路径将其分子和分母部分分开。所以所有的有理算术都给出了一个精确的表示(作为分数,但既不是浮点也不是小数(

TL/DR:如果您想要精确有理算术,只需将Decimal替换为Fraction

但是你的公式看起来很奇怪。根据维基百科,它应该是Prod(n-k/k) for 2<=k<=n:

from fractions import Fraction
n = int(input())
res = 1
for k in range(2, n+1):
res = res * Fraction(n-k, k)
res = int(res)
print(int(res//(k+1)))

我可以确认,这个公式给出了前10个加泰罗尼亚数字。

最新更新