2016-11-23 5 views
1

У меня есть этот метод:Удаление хвостовой рекурсии из метода (Java)

private String computePerm(int iteration) { 
     if (iteration < n + 1) { 
      return Character.toString((char) (iteration + 48)); 
     } else { 
      if (iteration % n == 0) { 
       return computePerm((iteration/n) - 1) + computePerm(((iteration - 1) % n + 1)); 
      } else { 
       return computePerm(iteration/n) + computePerm(iteration % n); 
      } 
     } 
    } 

вычисляет перестановку индуцированную одной поиска в ширину обхода. Я использую его для решения Post's correspondence problem. Тем не менее, я подозреваю, что он хвост-рекурсивный, и, по-видимому, он несет уродливые накладные расходы на некоторые случаи проблемы.

Как удалить хвостовую рекурсию при сохранении поведения метода?

+0

Есть 4 рекурсивных вызовов в вашем методе. Это не рекурсия хвоста. – shmosel

+0

@shmosel Затем как удалить рекурсию в первую очередь? Я, честно говоря, не могу так поступать, потому что подозреваю, что это будет немного быстрее. –

+0

Кто сказал, что вы можете? И почему вы уверены, что это будет быстрее? – shmosel

ответ

-1

Это делает то, что вы после (перестановок алфавита размера п):

private static String computePerm(int iteration) { 
    return Integer.toString(iteration, n); 
} 
+0

Я не думаю, что это то, что я ищу. Сожалею. –

+0

'computePerm()' генерирует перестановку вашего алфавита с размером _n_, правильно? Я предполагаю, что вы используете его для создания пар токенов для тестирования вашего решения. 'Integer.toString (i, radix)' делает то же, что и ваш метод. Посмотрите на его источник, если вам нужен пример итеративного решения вашей проблемы, или просто используйте вызов, если вам нужна только настройка тестовых данных. – teppic

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

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