我正在编写一个用于家庭作业的加泰罗尼亚数字生成器,我正在pytohon做一个递归程序。
该计划:
def catalan(n):
if n == 0:
c_f = 1
else:
c_f = ((4*n-2)/(n+1))*catalan(n-1)
return c_f
print catalan(10)
返回5832,这是错误的答案,但
def catalan(n):
if n == 0:
c_f = 1
else:
c_f = (4*n-2)*catalan(n-1)/(n+1)
return c_f
print catalan(10)
给了我16796,这是正确答案。
python不遵循PEMDAS吗?
答案 0 :(得分:2)
就像PEMDAS一样,python从左到右评估表达式。它评估(4*n-2)/(n+1)
,存储它(调用结果X
),然后计算X/catalan(n-1)
。
问题是,X
的价值是多少?对于n的所有值,(4*n-2)/(n+1)
不是整数,但是如果传入n
的值为int
,则表示您正在执行整数除法。结果是计算的小数部分被丢弃,并且您的计算偏离了轨道。
第二次迭代是有效的,因为加泰罗尼亚函数的一个属性是(4*n-2)*catalan(n-1)
表达式将是n-1
的倍数。这样,您将(可能是破坏性的)除法留给表达式的末尾,并且计算的数学属性可以保存您。