2015-09-25 4 views
1

Я программирую каталонский генератор чисел для домашней работы, и я делаю рекурсивную программу в pytohon.Python не соответствует порядку PEMDAS?

Программа:

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

вам нужно будет разработать ... python грубо следует за pemdas ... может быть, вы не совсем понимаете pemdas m == d и a == s, так что это простые операции слева направо –

ответ

2

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

Смежные вопросы