Các cuộc gọi và vòng lặp đệ quy chỉ là hai cách / cấu trúc để thực hiện tính toán lặp.
Một while
vòng lặp tương ứng với một cuộc gọi đệ quy đuôi (xem ví dụ ở đây ), tức là một lần lặp mà bạn không cần lưu kết quả trung gian giữa hai lần lặp (tất cả các kết quả của một chu kỳ đã sẵn sàng khi bạn bước vào chu kỳ tiếp theo). Nếu bạn cần lưu trữ các kết quả trung gian mà bạn có thể sử dụng lại sau này, bạn có thể sử dụng một while
vòng lặp cùng với một ngăn xếp (xem tại đây ) hoặc một cuộc gọi đệ quy không theo đuôi (tức là tùy ý).
Nhiều ngôn ngữ cho phép bạn sử dụng cả hai cơ chế và bạn có thể chọn một cơ chế phù hợp hơn với mình và thậm chí trộn chúng lại với nhau trong mã của bạn. Trong các ngôn ngữ bắt buộc như C, C ++, Java, v.v. bạn thường sử dụng một while
hoặc for
vòng lặp khi bạn không cần ngăn xếp và bạn sử dụng các cuộc gọi đệ quy khi bạn cần một ngăn xếp (bạn hoàn toàn sử dụng ngăn xếp thời gian chạy). Haskell (một ngôn ngữ chức năng) không cung cấp cấu trúc điều khiển lặp để bạn chỉ có thể sử dụng các cuộc gọi đệ quy để thực hiện phép lặp.
Trong ví dụ của bạn (xem ý kiến của tôi):
// 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;
}