2013-12-05 1 views
0

Стандартная формула Ackermann, как написано в Java:Можно ли оптимизировать стандартный Ackermann?

public static int ack(int x, int y) { 

     if (x == 0) { 
      return y + 1; 
     } else if (y == 0) { 
      return ack(x-1, 1); 
     } else { 
      // perforce (x > 0) && (y > 0) 
      return ack(x-1, ack(x,y-1)); 
     } 
    } 

Я задавался вопросом - есть ли более быстрый вариант осуществить это? Я думаю, может быть, с помощью аккумулятора или цикла.

+2

Я мог бы спросить, какой смысл? Единственное реальное теоретическое использование, которое я когда-либо слышал о функции Ackermann, является верхней границей для времени выполнения алгоритма. Действительно ли имеет значение, если игрушка выполняется быстро? –

+0

Я думаю, что другая проблема здесь, почему вы задали этот вопрос дважды сегодня? один раз для java и один раз для схемы? http://stackoverflow.com/questions/20393589/can-this-function-be-simplified-made-more-fast. По другому вопросу вы получили в основном те же ответы. –

ответ

3

Да, например, "обман". Если m равен 5 или выше, ни один из результатов не может быть представлен int. Для m = 4 могут быть представлены только n < 2. Для m < 4 существуют простые закрытые формулы на основе n.

Все остальное будет переполняться в любом случае, поэтому давайте притворяться, что эти случаи даже не происходят (или вы можете выбросить ошибку или что-то еще).

Не тестировалось:

int Ackerman(int m, int n) { 
    switch (m) { 
    case 0: 
     return n + 1; 
    case 1: 
     return n + 2; 
    case 2: 
     return n * 2 + 3; 
    case 3: 
     return (int)((1L << (n + 3)) - 3); 
    case 4: 
     return n == 0 ? 13 : 65533; 
    } 
} 
2

Я могу сказать вам одну вещь ... int не будет достаточно для очень многих значений х и у

Если вы собираетесь вызвать функцию повторно, вы можете создать int[][] массив для хранения различных так что вы можете посмотреть их на второй + время и только один раз вычислить его. Но что касается ускорения одного выполнения ... не уверен.

1

Это изменение происходит быстрее:

public static int ack(int x, int y) { 
    while (x != 0) { 
     y = y == 0 ? 1 : ack(x, y - 1); 
     x--; 
    } 
    return y + 1; 
} 

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

  • Нет связанных вопросов^_^