Les appels et boucles récursifs ne sont que deux manières / constructions pour implémenter un calcul itératif.
Une while
boucle correspond à un appel récursif de queue (voir par exemple ici ), c'est-à-dire une itération dans laquelle vous n'avez pas besoin de sauvegarder les résultats intermédiaires entre deux itérations (tous les résultats d'un cycle sont prêts lorsque vous entrez dans le cycle suivant). Si vous avez besoin de stocker des résultats intermédiaires que vous pourrez réutiliser plus tard, vous pouvez soit utiliser une while
boucle avec une pile (voir ici ), soit un appel récursif non récursif (c'est-à-dire arbitraire).
De nombreuses langues vous permettent d'utiliser les deux mécanismes et vous pouvez choisir celui qui vous convient le mieux et même les mélanger dans votre code. Dans les langages impératifs comme C, C ++, Java, etc., vous utilisez normalement une boucle while
ou for
lorsque vous n'avez pas besoin d'une pile, et vous utilisez des appels récursifs lorsque vous avez besoin d'une pile (vous utilisez implicitement la pile d'exécution). Haskell (un langage fonctionnel) n'offre pas de structure de contrôle d'itération, vous ne pouvez donc utiliser que des appels récursifs pour effectuer l'itération.
Dans votre exemple (voir mes commentaires):
// 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;
}