การเรียกซ้ำและการวนซ้ำเป็นเพียงสองวิธี / โครงสร้างเพื่อใช้การคำนวณแบบวนซ้ำ
การwhile
วนซ้ำนั้นสอดคล้องกับการเรียกแบบเรียกซ้ำ (ดูที่นี่ ) เช่นการวนซ้ำซึ่งคุณไม่จำเป็นต้องบันทึกผลลัพธ์ระหว่างการทำซ้ำสองรอบ (ผลลัพธ์ทั้งหมดของรอบเดียวพร้อมเมื่อคุณเข้าสู่รอบถัดไป) หากคุณต้องการเก็บผลลัพธ์ขั้นกลางที่คุณสามารถใช้อีกครั้งในภายหลังคุณสามารถใช้การwhile
วนซ้ำพร้อมกับสแต็ก (ดูที่นี่ ) หรือการเรียกซ้ำแบบเรียกซ้ำ (เช่นโดยพลการ)
หลายภาษาให้คุณใช้ทั้งสองกลไกและคุณสามารถเลือกภาษาที่เหมาะกับคุณมากยิ่งขึ้นและแม้แต่ผสมเข้าด้วยกันในรหัสของคุณ ในภาษาที่จำเป็นเช่น C, C ++, Java เป็นต้นโดยปกติแล้วคุณจะใช้ a while
หรือfor
loop เมื่อคุณไม่ต้องการ stack และคุณใช้การเรียกซ้ำเมื่อคุณต้องการ stack (โดยปริยายใช้ stack โดยใช้ run-time) Haskell (ภาษาที่ใช้งานได้) ไม่มีโครงสร้างการควบคุมการทำซ้ำดังนั้นคุณจึงสามารถใช้การเรียกซ้ำเพื่อดำเนินการซ้ำได้
ในตัวอย่างของคุณ (ดูความคิดเห็นของฉัน):
// 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;
}