Las llamadas y bucles recursivos son solo dos formas / construcciones para implementar un cálculo iterativo.
Un while
bucle corresponde a una llamada recursiva de cola (ver, por ejemplo, aquí ), es decir, una iteración en la que no necesita guardar resultados intermedios entre dos iteraciones (todos los resultados de un ciclo están listos cuando ingresa al siguiente ciclo). Si necesita almacenar resultados intermedios que puede usar nuevamente más tarde, puede usar un while
bucle junto con una pila (ver aquí ) o una llamada recursiva no recursiva de cola (es decir, arbitraria).
Muchos idiomas le permiten usar ambos mecanismos y puede elegir el que mejor se adapte a usted e incluso mezclarlos en su código. En lenguajes imperativos como C, C ++, Java, etc., normalmente usa un bucle while
o for
cuando no necesita una pila, y usa llamadas recursivas cuando necesita una pila (implícitamente usa la pila de tiempo de ejecución). Haskell (un lenguaje funcional) no ofrece una estructura de control de iteración, por lo que solo puede usar llamadas recursivas para realizar la iteración.
En su ejemplo (vea mis comentarios):
// 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;
}
placeQueen
"place 8 queens" es la versión más fácil deplaceQueen
"place 7 queens" (luego place 6, etc.)