पुनरावर्ती कॉल और लूप एक पुनरावृत्ति गणना को लागू करने के लिए सिर्फ दो तरीके / निर्माण हैं।
एक 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;
}