Euler проекта (P14): проблемы рекурсии

Когда строка содержит только один символ, вы все равно запускаете String s1 = s.substring(0,2);, который попытается получить доступ ко второму символу, и вы получите исключение вне диапазона.

Вы можете написать свой код как:

 String s = "o";
 String s1 = s;


if (s.length() > 2) {
    s1 = s.substring(0,2);
}
System.out.println(s1);    

Таким образом, вы можете создать подстроку из s, только если она содержит более 2 символов.

5
задан iCodez 22 January 2015 в 16:14
поделиться

4 ответа

Если Вы изменитесь от целого числа до длинного, то оно даст Вам достаточно комнаты для решения проблемы. Здесь был код, что я раньше отвечал на этого:

    for(int i=1;i<=1000000;i+=2)
    {
        steps=1;
        int n=i;
        long current=i;
        while(current!=1)
        {
            if(current%2==0)
            {
                current=current/2;
            }else{
                current=(current*3)+1;
            }
            steps++;
        }
        if(steps>best)
        {
            best=steps;
            answer=n;
        }
    }

Скот, вызывающий его, занимает приблизительно 9 секунд для выполнения

2
ответ дан 13 December 2019 в 05:43
поделиться

Ваша проблема не с размером стека (Вы уже - memoizing значения), но с

  1. размер некоторых чисел в последовательностях, и
  2. верхние пределы 32-разрядного целого числа.

Подсказка:

public static int seqCount(int n)
{
   if(hm.get(n) != null) {
       return hm.get(n);
   }
   if (n < 1) {
      // this should never happen, right? ;)
   } ...
   ...

Это должно, надо надеяться, быть достаточно :)

P.S. Вы столкнетесь с потребностью в BigNums в большом количестве эйлеровых проблем проекта...

8
ответ дан 13 December 2019 в 05:43
поделиться

При подсчете размера последовательности Collatz для чисел до 1 000 000, необходимо пересмотреть Целый тип использования. Я предлагаю использовать BigInteger или возможный длинное.

Это должно облегчить проблемы, с которыми встречаются, но быть предупреждено, что у можно все еще закончиться пространство "кучи" в зависимости от JVM.

1
ответ дан 13 December 2019 в 05:43
поделиться

Примечание стороны (поскольку кажется, что Вам на самом деле не нужна оптимизация последнего вызова для этой проблемы): оптимизация последнего вызова не доступна в Java, и насколько я услышал, это даже не поддерживается байт-кодом JVM. Это означает, что любая глубокая рекурсия не возможна, и необходимо осуществить рефакторинг ее для использования некоторой другой конструкции цикла.

1
ответ дан 13 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: