1

我正在为家庭作业编写一个加泰罗尼亚语数字生成器,并且我正在 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吗?

4

1 回答 1

2

就像 PEMDAS 一样,python 从左到右计算表达式。它评估(4*n-2)/(n+1)、存储它(调用结果X),然后计算X/catalan(n-1)

问题是,值是X多少?(4*n-2)/(n+1)不是 n 的所有值的整数,但是如果您传入的值n是 python int ,那么您正在执行整数除法。结果是计算的小数部分被丢弃,并且您的计算偏离了轨道。

第二次迭代有效,因为 catalan 函数的一个属性是(4*n-2)*catalan(n-1)表达式将是n-1. 这样,您将(可能具有破坏性的)除法留在表达式的末尾,并且计算的数学属性可以节省您的时间。

于 2015-09-25T21:30:50.163 回答