Rekursive Aufrufe und Schleifen sind nur zwei Möglichkeiten / Konstrukte zur Implementierung einer iterativen Berechnung.
Eine while
Schleife entspricht einem endrekursiven Aufruf (siehe z. B. hier ), dh einer Iteration, bei der Sie keine Zwischenergebnisse zwischen zwei Iterationen speichern müssen (alle Ergebnisse eines Zyklus sind bereit, wenn Sie in den nächsten Zyklus eintreten). Wenn Sie Zwischenergebnisse speichern müssen, die Sie später erneut verwenden können, können Sie entweder eine while
Schleife zusammen mit einem Stapel (siehe hier ) oder einen nicht rekursiven (dh willkürlichen) rekursiven Aufruf verwenden.
In vielen Sprachen können Sie beide Mechanismen verwenden, und Sie können den für Sie am besten geeigneten auswählen und diese sogar in Ihrem Code mischen. In imperativen Sprachen wie C, C ++, Java usw. verwenden Sie normalerweise eine while
oder for
-Schleife, wenn Sie keinen Stapel benötigen, und Sie verwenden rekursive Aufrufe, wenn Sie einen Stapel benötigen (Sie verwenden implizit den Laufzeitstapel). Haskell (eine funktionale Sprache) bietet keine Iterationskontrollstruktur, sodass Sie nur rekursive Aufrufe verwenden können, um die Iteration durchzuführen.
In deinem Beispiel (siehe meine Kommentare):
// 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;
}