En este código (no hace falta que analiceis su función), ¿cómo es posible que tenga que utilizar un segundo return para terminar la ejecución de la función? Es decir, por lo visto el primer return lo hace, ya que si pongo un trace justo después no lo muestra pero, teniendo en cuenta que esta es una función recursiva y que sólo se le llama una vez desde fuera, ¿por qué sigue ejecutándose?
Código :
function sudoku_VA(i:Number, j:Number, sol:Array, inicial:Array):Boolean {
// si la casilla está vacía...
if (!inicial[i][j]) {
for (var k:Number = 9; k>=1; k--) {
//Marcar
sol[i][j] = k;
if (es_factible(i, j, sol)) {
if (i == 8 && j == 8) {
for (var v:Number = 0; v<=8; v++) {
trace(sol[v]);
}
// tablero completado
a = false;
/// HACE
return true;
}
// SI NO FUESE POR ESTE RETURN, LA FUNCIÓN SEGUIRÍA LLAMÁNDOSE
if (!a) {
return true;
}
/////////////////////////////////////////////////////////////
else if (i<8 && j == 8) {
sudoku_VA(i+1, 0, sol, inicial);
} else if (i<=8 && j<8) {
sudoku_VA(i, j+1, sol, inicial);
}
}
//Desmarcar
sol[i][j] = 0;
}
} else {
if (i == 8 && j == 8) {
for (var v:Number = 0; v<=8; v++) {
trace(sol[v]);
}
} else if (i<8 && j == 8) {
sudoku_VA(i+1, 0, sol, inicial);
} else if (i<=8 && j<8) {
sudoku_VA(i, j+1, sol, inicial);
}
}
}
Como veo que me semi-ignora el primer return, le he dicho que me indique el momento en que quiere salir y, mediante un if, hago la comprobación. Cuando encuentra el segundo return si que deja la ejecución, ¿por qué no en el primero?
No consigo entenderlo
