Le chiamate e i loop ricorsivi sono solo due modi / costrutti per implementare un calcolo iterativo.
Un ciclo while
corrisponde a una chiamata ricorsiva in coda (vedi ad esempio qui ), cioè un'iterazione in cui non è necessario salvare i risultati intermedi tra due iterazioni (tutti i risultati di un ciclo sono pronti quando si accede al ciclo successivo). Se devi memorizzare risultati intermedi che puoi riutilizzare in un secondo momento, puoi utilizzare un ciclo while
insieme a uno stack (vedi qui ), o una chiamata ricorsiva non ricorsiva (cioè arbitraria).
Molte lingue ti consentono di utilizzare entrambi i meccanismi e puoi scegliere quello che ti si addice meglio e persino mescolarli nel tuo codice. In linguaggi imperativi come C, C ++, Java, ecc. Normalmente usi un ciclo while
o for
quando non hai bisogno di uno stack, e usi le chiamate ricorsive quando hai bisogno di uno stack (usi implicitamente il tempo di esecuzione pila).
Haskell (un linguaggio funzionale) non offre una struttura di controllo di iterazione, quindi puoi utilizzare solo le chiamate ricorsive per eseguire l'iterazione.
Nel tuo esempio (vedi i miei commenti):
// 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;
}