Лучший стиль для поддержания длинного уравнения - PullRequest
0 голосов
/ 14 октября 2011

Как вы думаете, как лучше написать этот метод для вычисления значения ackermann ?Эта функция включает в себя несколько «коротких путей» к простейшему методу вычисления значения, которое значительно ускоряет вычисление за счет уменьшения количества рекурсивных вызовов, но в итоге вы получаете длинное выражение.

В версиях используются:

  • Символ продолжения строки \
  • Вложенные в скобках функции
  • Один внешний набор скобок

Какая версия кажется вам лучше?Зачем?Мне любопытно.

>>> def ack4(M, N):
   return (N + 1)            if M == 0 else \
          (N + 2)            if M == 1 else \
          (2*N + 3)          if M == 2 else \
          (8*(2**N - 1) + 5) if M == 3 else \
          ack4(M-1, 1)       if N == 0 else \
          ack4(M-1, ack4(M, N-1))

>>> def ack2(M, N):
   return (N + 1)            if M == 0 else (
          (N + 2)            if M == 1 else (
          (2*N + 3)          if M == 2 else (
          (8*(2**N - 1) + 5) if M == 3 else (
          ack2(M-1, 1)       if N == 0 else
          ack2(M-1, ack2(M, N-1))))))

>>> def ack3(M, N):
   return ((N + 1)            if M == 0 else
           (N + 2)            if M == 1 else
           (2*N + 3)          if M == 2 else
           (8*(2**N - 1) + 5) if M == 3 else
           ack3(M-1, 1)       if N == 0 else
           ack3(M-1, ack3(M, N-1)))

>>> ack2(4, 2) == ack3(4, 2) == ack4(4, 2)
True
>>> 

Ответы [ 3 ]

4 голосов
/ 14 октября 2011

Что плохого в том, чтобы просто вкладывать в простую цепочку elif?

def ack5(m, n):
    if m == 0:
        return (n + 1)
    elif m == 1:
        return (n + 2)
    elif m == 2:
        return (2 * n + 3)
    elif m == 3:
        return (8 * ( 2 ** n - 1) + 5)
    elif n == 0:
        return ack5(m - 1, 1)
    else:
        return ack5(m - 1, ack5(m, n - 1))

Код Python должен быть читабельным для программиста, так что это скорее вопрос личного выбора.Если бы мне пришлось выбрать один из ваших 3 примеров, я бы пошел с ack4, так как эти обратные слеши указывают, что все это одно большое утверждение без раздувания выражения, как, по моему мнению, скобка.

3 голосов
/ 14 октября 2011

Не бойтесь многократного возвращения.Также старайтесь избегать заглавных букв для локальных переменных.

def ack4(m, n):
    if m == 0:
        return n + 1
    if m == 1:
        return n + 2
    if m == 2:
        return 2 * n + 3
    if m == 3:
        return (8 * ( 2 ** n - 1) + 5)
    if n == 0:
        return ack5(m - 1, 1)
    return ack5(m - 1, ack5(m, n - 1))    
0 голосов
/ 14 октября 2011
def ack5(m, n):
    if m == 0: return n + 1
    if m == 1: return n + 2
    if m == 2: return 2*n + 3
    if m == 3: return 8*(2**n - 1) + 5
    if n == 0: return ack5(m-1, 1)
    return ack5(m-1, ack5(m, n-1)) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...