2012-06-25 6 views
0

Я пишу генератор судоку.Переполнение стека при попытке генерировать случайное число

static void change(int[][] x, int[][] y, int[][] z, int[][] w, int [][] u, int k){ 
      int a = r1.nextInt(9); 
      int b = r2.nextInt(2); 
      int c = r3.nextInt(2); 
      if (x[b][c]!=0 && vcheck(a, c, x, y, z)!=false && hcheck(a, b, x, u, w)!= false && tcheck (a, x)!=false){ 
       x[b][c]=a; 
       k--; 
      } 
      else change(x, y, z, w, u, k); 
    } 

эта часть программы является недействительным, который инициирует изменение числа Int таблицы на случайно сгенерированных позиции (б, в) к значению. заброшенная ошибка

Exception in thread "main" java.lang.StackOverflowError 
    at java.util.Random.nextInt(Random.java:307) 

может кто-нибудь сказать мне, что я должен изменить?

+1

Преобразование, что рекурсивный алгоритм в повторяющийся: http://stackoverflow.com/questions/159590/way-to-go-from-recursion-to-iteration –

+2

Что случилось с генератором рекурсивного номера? Изменение алгоритма из рекурсии на итерацию не поможет ОП понять рекурсию, которая на самом деле может быть причиной написания ее таким образом. @ user1480211: вы получаете ошибку переполнения стека, потому что вам нужно вернуться после того, как вы достигнете базового варианта. –

+2

Здесь что-то не хватает: ветка else просто рекурсирует с теми же параметрами. Если один из vcheck, hcheck или tcheck не модифицирует содержимое массива, он никогда не вернется, как только он достигнет этого состояния. Кроме того, используйте имена переменных, которые имеют смысл. Я понятия не имею, что этот метод должен делать. – Alex

ответ

1

StackOverflowError - это то, что вы получаете, когда ваша рекурсия проходит слишком глубоко. Это обычно является признаком ошибки проектирования. Мне кажется, что вы позволяете генераторам случайных чисел управлять глубиной рекурсии. Это определенно плохая идея, поскольку не гарантируется, что RNG будут генерировать числа, необходимые для предотвращения рекурсивных вызовов до того, как VM закончит пространство стека.

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

k--; 

Вы должны, вероятно, дать немного больше мысли к вашему алгоритму.

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