Yinelemeli çağrılar ve döngüler, yinelemeli bir hesaplamayı uygulamanın yalnızca iki yoludur.
Bir while
döngü kuyruk yinelemeli çağrıya karşılık gelir (örneğin buraya bakınız ), yani iki yineleme arasında ara sonuçları kaydetmeniz gerekmeyen bir yineleme (bir sonraki döngüye girdiğinizde bir döngünün tüm sonuçları hazırdır). Daha sonra tekrar kullanabileceğiniz ara sonuçları saklamanız gerekiyorsa, bir while
yığıyla birlikte bir döngü ( buraya bakın ) veya kuyruk özyinelemesiz (yani rasgele) özyinelemeli çağrı kullanabilirsiniz.
Birçok dil, her iki mekanizmayı da kullanmanıza izin verir ve size daha uygun olanı seçebilir ve hatta kodunuzda karıştırabilirsiniz. C, C ++, Java, vb. Gibi zorunlu dillerde, bir yığına ihtiyacınız olmadığında normalde bir while
veya for
döngü kullanırsınız ve bir yığına ihtiyacınız olduğunda özyinelemeli çağrılar kullanırsınız (örtük olarak çalışma zamanı yığınını kullanırsınız). Haskell (işlevsel bir dil) yineleme kontrol yapısı sunmaz, böylece yinelemeyi gerçekleştirmek için yalnızca yinelemeli çağrıları kullanabilirsiniz.
Örneğinizde (yorumlarıma bakın):
// 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;
}