Рекурсивные вызовы и циклы - это всего лишь два способа / конструкции для реализации итерационных вычислений.
А while
петля соответствует хвостовой рекурсии вызова (смотрите , например , здесь ), т.е. итерация , в которой вам не нужно сохранять промежуточные результаты между двумя итерациями (все результаты одного цикла готовы , когда вы входите в следующий цикл). Если вам нужно сохранить промежуточные результаты, которые вы сможете использовать позже, вы можете использовать while
цикл вместе со стеком (см. Здесь ), или нерекурсивный (то есть произвольный) рекурсивный вызов.
Многие языки позволяют вам использовать оба механизма, и вы можете выбрать тот, который вам больше подходит, и даже смешать их вместе в своем коде. В императивных языках, таких как C, C ++, Java и т. Д., Вы обычно используете цикл while
или, for
когда вам не нужен стек, и используете рекурсивные вызовы, когда вам нужен стек (вы неявно используете стек времени выполнения). Haskell (функциональный язык) не предлагает структуру управления итерацией, поэтому вы можете использовать только рекурсивные вызовы для выполнения итерации.
В вашем примере (см. Мои комментарии):
// queens should have type int [] , not int.
private boolean placeQueen(int row, int [] queens, int n)
{
boolean result = false;
if (row < n)
{
// Iterate with queens[row] = 1 to n - 1.
// After each iteration, you either have a result
// in queens, or you have to try the next column for
// the current row: no intermediate result.
while ((queens[row] < n - 1) && !result)
{
queens[row]++;
if (verify(row,queens,n))
{
// I think you have 'result' here, not 'ok'.
// This is another loop (iterate on row).
// The loop is implemented as a recursive call
// and the previous values of row are stored on
// the stack so that we can resume with the previous
// value if the current attempt finds no solution.
result = placeQueen(row + 1,queens,n);
}
}
if (!result) {
queens[row] = -1;
}
}else{
result = true;
}
return result;
}