Chamadas e loops recursivos são apenas duas maneiras / construções para implementar uma computação iterativa.
Um while
loop corresponde a uma chamada recursiva de cauda (veja, por exemplo, aqui ), ou seja, uma iteração na qual você não precisa salvar resultados intermediários entre duas iterações (todos os resultados de um ciclo estão prontos quando você entra no próximo ciclo). Se você precisar armazenar resultados intermediários que possam ser usados novamente mais tarde, poderá usar um while
loop junto com uma pilha (veja aqui ) ou uma chamada recursiva não recursiva (ou seja, arbitrária).
Muitos idiomas permitem usar os dois mecanismos e você pode escolher o que melhor combina com você e até misturá-los no seu código. Em linguagens imperativas como C, C ++, Java etc., você normalmente usa a while
ou for
loop quando não precisa de uma pilha e usa chamadas recursivas quando precisa de uma pilha (você usa implicitamente a pilha de tempo de execução). O Haskell (uma linguagem funcional) não oferece uma estrutura de controle de iteração, portanto, você pode usar apenas chamadas recursivas para executar a iteração.
No seu exemplo (veja meus comentários):
// 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;
}