2016-01-08 3 views
0

У меня есть рекурсивный метод, который я уверен, конечно. Однако, когда я запускаю его, я получаю ошибку переполнения стека. Есть ли другой способ получения переполнения стека, который я выполняю или что не так с этим методом?Возможна ли стека OverFlow Ошибка при конечной рекурсии?

public static void solve(int row, int column){ 
    if (row<=8){ 
     if (column>8){ 
      solve(row+1, 0); 
     } 
     if (row<=8 && column<=8 && (Rows[row][column]==0)){ 
      for (int a = 1; a<=9;a++){ 
       if (check(row, column, a)==false&&Rows[row][column]!=a){ 
        Rows[row][column]=a; 
        break; 
       } 
      } 
     } 
     solve(row, column+1); 
    } 
} 
+5

* Возможен переполнение стека в конечной рекурсии * ** Да **?. См. Также функцию [Ackermann] (https://en.wikipedia.org/wiki/Ackermann_function). –

+2

Да, это вполне возможно в «конечной» рекурсии - так как легко написать программу, которая выполняет конечную рекурсию, но будет исчерпывать самые распространенные размеры стековой памяти, очень ** конечного ** ресурса. –

+1

Извините, я сейчас спешу, поэтому я не могу написать ответ о вашей проблеме, но вы хотите, чтобы 'if (column> 8) разрешал (строка + 1, 0); else solve (row, column + 1); '. Единственная строка 'solve (row, column + 1);' в вашем коде должна использоваться только в том случае, если 'column> 8' false. – Tom

ответ

2

размер стека в JVM ограничено, поэтому можно получить StackOverflow с конечной рекурсии или даже без рекурсии.

Вы можете увеличить размер стека виртуальной машины Java, используя -Xss вариант:

java -Xss16M YouMainClass 
Смежные вопросы