Panggilan dan loop rekursif hanyalah dua cara / konstruk untuk mengimplementasikan komputasi berulang.
Sebuah while
loop berhubungan dengan panggilan berulang -ekor (lihat misalnya di sini ), yaitu iterasi di mana Anda tidak perlu menyimpan hasil antara antara dua iterasi (semua hasil dari satu siklus siap ketika Anda memasuki siklus berikutnya). Jika Anda perlu menyimpan hasil antara yang dapat Anda gunakan lagi nanti Anda bisa menggunakan satu while
lingkaran bersama dengan tumpukan (lihat di sini ), atau panggilan rekursif non-ekor-rekursif (yaitu sewenang-wenang).
Banyak bahasa memungkinkan Anda untuk menggunakan kedua mekanisme tersebut dan Anda dapat memilih salah satu yang lebih cocok untuk Anda dan bahkan menggabungkan keduanya dalam kode Anda. Dalam bahasa imperatif seperti C, C ++, Java, dll. Anda biasanya menggunakan a while
atau for
loop ketika Anda tidak membutuhkan stack, dan Anda menggunakan panggilan rekursif ketika Anda membutuhkan stack (Anda secara implisit menggunakan run-time stack). Haskell (bahasa fungsional) tidak menawarkan struktur kontrol iterasi sehingga Anda hanya dapat menggunakan panggilan rekursif untuk melakukan iterasi.
Dalam contoh Anda (lihat komentar saya):
// 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;
}