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