পুনরাবৃত্ত কল এবং লুপগুলি পুনরাবৃত্ত গণনা বাস্তবায়নের জন্য কেবল দুটি উপায় / কনস্ট্রাক্ট।
একটি while
লুপ একটি লেজ-পুনরাবৃত্তির কলের সাথে সম্পর্কিত (যেমন দেখুন এখানে ), অর্থাত্ একটি পুনরাবৃত্তি যাতে আপনাকে দুটি পুনরাবৃত্তির মধ্যে মধ্যবর্তী ফলাফলগুলি সংরক্ষণ করার দরকার নেই (আপনি যখন পরবর্তী চক্রটিতে প্রবেশ করেন তখন একটি চক্রের সমস্ত ফলাফল প্রস্তুত থাকে)। যদি আপনাকে মধ্যবর্তী ফলাফলগুলি সংরক্ষণ করতে হয় যা পরে আপনি আবার ব্যবহার করতে পারেন তবে আপনি হয় while
স্ট্যাকের সাথে একটি লুপ ব্যবহার করতে পারেন ( এখানে দেখুন ), অথবা একটি নন টেইল-রিকার্সিভ (অর্থাত্ স্বেচ্ছাচারী) পুনরাবৃত্তি কল।
অনেক ভাষাগুলি আপনাকে উভয় প্রক্রিয়া ব্যবহারের অনুমতি দেয় এবং আপনি যেটি আপনার পক্ষে উপযুক্ত তা বেছে নিতে পারেন এবং এমনকি আপনার কোডে এগুলি একসাথে মিশ্রিত করতে পারেন। সি, সি ++, জাভা ইত্যাদি অনুজ্ঞাসূচক ভাষায় আপনি সাধারণত একটি ব্যবহার while
বা for
যখন আপনি একটি স্ট্যাক প্রয়োজন হবে না লুপ, এবং আপনি রিকার্সিভ কল ব্যবহার যখন আপনি একটি স্ট্যাক (আপনি পরোক্ষভাবে রান-টাইম স্ট্যাক ব্যবহার করুন) প্রয়োজন। হাস্কেল (একটি কার্যকরী ভাষা) একটি পুনরাবৃত্তি নিয়ন্ত্রণ কাঠামো সরবরাহ করে না যাতে আপনি কেবল পুনরাবৃত্তি সম্পাদন করতে পুনরাবৃত্ত কলগুলি ব্যবহার করতে পারেন।
আপনার উদাহরণে (আমার মন্তব্য দেখুন):
// 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;
}