यह देखने के लिए पहली बात यह है कि यदि आप 5 पंक्तियों में से प्रत्येक में से 3 वर्णों में से एक का चयन करके शब्द बना रहे हैं, तो आप कुल 3 = 243 शब्दों के साथ समाप्त हो जाएंगे। इस कार्यक्रम के बावजूद कि आप प्रोग्राम को कैसे कार्यान्वित करते हैं, इसे 243 शब्दों में से प्रत्येक को बनाना होगा।
रिकर्सन एक अच्छी कार्यान्वयन रणनीति है क्योंकि यह स्पष्ट करता है कि आप पहली पंक्ति में तीन वर्णों में से एक का चयन कर रहे हैं, और उन विकल्पों में से प्रत्येक के लिए आप दूसरी पंक्ति में तीन वर्णों में से एक का चयन करने के लिए जाते हैं , और इसी तरह।
नीचे दिए गए जावा प्रोग्राम में, makeWord
का पहला संस्करण एक रिकर्सिव फ़ंक्शन है जो currentRowIndex
द्वारा अनुक्रमित पंक्ति में एक वर्ण का चयन करता है और उस वर्ण को wordBuffer
पर जोड़ता है। यदि यह आखिरी पंक्ति है, तो शब्द पूर्ण हो गया है और यह शब्दों की सूची में संलग्न हो जाता है। अन्यथा, फ़ंक्शन स्वयं को currentRowIndex + 1
पर काम करने के लिए कॉल करता है।
ध्यान दें कि wordBuffer
की वर्तमान स्थिति रिकर्सिव कॉल के माध्यम से होती है। रिकर्सिव कॉल से लौटने के बाद ही हम wordBuffer
से अंतिम चरित्र हटाते हैं।
makeWord
का दूसरा संस्करण आपको पंक्ति सूचकांकों की एक सरणी पास करने देता है जो निर्दिष्ट करता है कि आप कौन सी पंक्तियों को वर्ण चुनना चाहते हैं।उदाहरण के लिए, पंक्तियों 1, 3, और 6 से पात्रों का चयन करने के लिए, आप कहेंगे:
permuter.makeWord(new int[]{ 1, 3, 6 }, 0);
आप वर्तमान पंक्ति के बजाय main
विधि है, जो अक्षरों के साथ निर्मित किया जाना एक शब्द का कारण बनता है में है कि कॉल स्थानापन्न कर सकते हैं के माध्यम से 1 से 5 पंक्तियों से:
permuter.makeWord(1, 5);
आप makeWord
तरीकों पर विशेष ध्यान दें, तो आप देखेंगे कि पहले एक recurse नहीं है जब स्ट्रिंग पूरा हो गया है, जबकि दूसरा एक एक बार और फिर recurses जल्दी लौटता है क्योंकि position == indices.length
। उत्तरार्द्ध दृष्टिकोण थोड़ा कम कुशल है क्योंकि इसकी लागत एक और रिकर्सिव कॉल है, लेकिन आप पाते हैं कि यह रिकर्सन की अवधारणा को और स्पष्ट रूप से व्यक्त करता है। यह स्वाद का मामला है।
import java.util.*;
public class PermuteCharacters {
char[][] rows = {
{},
{'A','B','C'},
{'D','E','F'},
{'G','H','I'},
{'J','K','L'},
{'M','N','O'},
{'P','R','S'},
{'T','U','V'},
{'W','X','Y'}
};
StringBuffer wordBuffer = new StringBuffer();
ArrayList<String> words = new ArrayList<String>();
void makeWord(int currentRowIndex, int endRowIndex) {
char[] row = rows[currentRowIndex];
for (int i = 0; i < row.length; ++i) {
wordBuffer.append(row[i]);
if (currentRowIndex == endRowIndex) {
words.add(wordBuffer.toString());
} else {
makeWord(currentRowIndex + 1, endRowIndex);
}
wordBuffer.deleteCharAt(wordBuffer.length() - 1);
}
}
void makeWord(int[] indices, int position) {
if (position == indices.length) {
words.add(wordBuffer.toString());
return;
}
char[] row = rows[indices[position]];
for (int i = 0; i < row.length; ++i) {
wordBuffer.append(row[i]);
makeWord(indices, position + 1);
wordBuffer.deleteCharAt(wordBuffer.length() - 1);
}
}
void displayWords() {
if (words.size() != 0) {
System.out.print(words.get(0));
for (int i = 1; i < words.size(); ++i) {
System.out.print(" " + words.get(i));
}
System.out.println();
}
System.out.println(words.size() + " words");
}
public static void main(String[] args) {
PermuteCharacters permuter = new PermuteCharacters();
permuter.makeWord(1, 5);
permuter.displayWords();
}
}
आप निश्चित रूप से रिकर्सन का उपयोग नहीं करना चाहते हैं। यह निश्चित रूप से एक गतिशील प्रोग्रामिंग समस्या है। लूप – DavidR
के लिए उपयोग करने के मामले में सोचें, समस्या को बेहतर समझने योग्य बनाने के लिए कृपया कुछ नमूना इनपुट और आउटपुट दिखाएं – luk2302
जैसा आपने कहा था, क्या यह चीजों को स्पष्ट करता है? –