Python не следует порядку PEMDAS?

Я программирую генератор каталонских чисел для домашней работы, и я делаю рекурсивную программу в 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, что является правильным ответом.

Так питон не следует за PEMDAS?

1 ответ

Как и PEMDAS, python оценивает выражения слева направо. Оценивает (4*n-2)/(n+1), хранит его (назовите результат X), а затем вычисляет X/catalan(n-1),

Проблема в том, какова ценность X? (4*n-2)/(n+1) не является целым числом для всех значений n, но если вы передаете значение n это питон int вы выполняете целочисленное деление. Результатом является то, что дробная часть вычислений отбрасывается, и ваши вычисления сходят с ума.

Вторая итерация работает, потому что свойство каталонской функции заключается в том, что (4*n-2)*catalan(n-1) Выражение будет кратным n-1, Таким образом, вы оставляете (потенциально разрушительное) деление до конца выражения, и математические свойства ваших вычислений спасают вас.

Другие вопросы по тегам