"हाय, अमिगो. आज बिलाबो तुला पुनरावृत्तीबद्दल सांगणार आहे."

पुनरावृत्ती - १

तुम्हाला माहिती आहे की, Java मध्ये काही पद्धती इतर पद्धतींना कॉल करतात. याव्यतिरिक्त, जेव्हा एखादी पद्धत कॉल केली जाते, तेव्हा त्यावर विशिष्ट युक्तिवाद दिले जातात, परंतु ती चालत असताना पद्धतीचे स्थानिक व्हेरिएबल्स विशिष्ट मूल्ये घेतात.

"उह-हह."

"आणि जसे तुम्हाला माहिती आहे, विविध पद्धतींचे अंतर्गत चल एकमेकांपासून स्वतंत्र आहेत."

"उह-हह."

"म्हणून एखादी पद्धत स्वतःला कॉल करते त्या परिस्थितीची कल्पना करा. याला पुनरावृत्ती म्हणतात. उदाहरणार्थ:"

उदाहरण
public static void main(String[] args)
{
 countDown(10);
}

public static void countDown(int x)
{
 if (x <= 0)
  System.out.println("Boom!");
 else
 {
  System.out.println(x);
  countDown(x - 1);
 }
}
स्क्रीन आउटपुट:
10
9
8
7
6
5
4
3
2
1
Boom!

"मी पाहू शकतो की पद्धत स्वतःच कोडमध्ये कॉल करते, परंतु मला प्रामाणिकपणे काय होत आहे ते समजत नाही."

"ठीक आहे, जेव्हा एखादी वेगळी पद्धत बोलावली जाते तेव्हा घडते त्याच गोष्टीबद्दल."

"नाही, मी विचारत आहे की व्हेरिएबल्सचे काय होते? त्यांच्या मूल्यांसह? आणि आपण पद्धतीतून कसे बाहेर पडू? किंवा आपण सर्व काही एकाच वेळी बाहेर पडू?"

"चांगुलपणा दयाळू आहे. हे सर्व बरेच सोपे आहे. कल्पना करा की स्वतःला कॉल करणारी पद्धत अनेक वेळा गुणाकार केली गेली आहे. मग आपल्याकडे समान परिस्थिती असेल:"

आवर्ती पद्धत कॉल खरोखर काय होते
public static void main(String[] args)
{
 countDown(10);
}

public static void countDown(int x)
{
 if (x <= 0)
  System.out.println("Boom!");
 else
 {
  System.out.println(x);
  countDown(x - 1);
 }
}
public static void main(String[] args)
{
 countDown1(10);
}

public static void countDown1(int x)
{
 if (x <= 0)
  System.out.println("Boom!");
 else
 {
  System.out.println(x);
  countDown2(x - 1);
 }
}
public static void countDown2(int x)
{
 if (x <= 0)
  System.out.println("Boom!");
 else
 {
  System.out.println(x);
  countDown3(x - 1);
 }
}
public static void countDown3(int x)
{
 if (x <= 0)
  System.out.println("Boom!");
 else
 {
  System.out.println(x);
  countDown4(x - 1);
 }
}

public static void countDown4(int x)
{
 if (x <= 0)
  System.out.println("Boom!");
 else
 {
  System.out.println(x);
  countDown5(x - 1);
 }
}
स्क्रीन आउटपुट: स्क्रीन आउटपुट:
3
2
1
Boom!
3
2
1
Boom!

"दुसर्‍या शब्दांत, प्रत्येक वेळी जेव्हा एखादी पद्धत (स्वतःहून) कॉल केली जाते तेव्हा नवीन व्हेरिएबल्स तयार केले जातात जे या पद्धतीसाठी डेटा संग्रहित करतात. तेथे कोणतेही सामायिक व्हेरिएबल्स नाहीत."

"प्रत्येक कॉलसह, नवीन मूल्यांसह, मेथड वितर्कांची दुसरी प्रत मेमरीमध्ये तयार केली जाते. जेव्हा आपण जुन्या पद्धतीकडे परत येतो, तेव्हा तिची व्हेरिएबल्स तिथे वापरली जातात. दुसऱ्या शब्दांत, पुनरावृत्ती दरम्यान आपण प्रत्यक्षात दुसरी पद्धत कॉल करतो, परंतु आमच्यासारखाच कोड! "

"मी पाहतो. आणि अशा पद्धतींमधून बाहेर पडणे कसे कार्य करते? कदाचित एक उदाहरण?"

"ठीक आहे. एक उदाहरण हजार शब्दांचे आहे. "हे तुमचे उदाहरण आहे:"

आवर्ती पद्धत कॉल आवर्ती पद्धत कॉल
public static void main(String[] args)
{
 print(3);
}

public static void print(int x)
{
 if (x <= 0)
  System.out.println("Boom!");
 else
 {
  System.out.println(x);
  print(x - 1);
  System.out.println(x);
 }
}
public static void main(String[] args)
{
 print1(3);
}

public static void print1(int x)
{
 if (x <= 0)
  System.out.println("Boom!");
 else
 {
  System.out.println(x);
  print2(x - 1);
  System.out.println(x);
 }
}

public static void print2(int x)
{
 if (x <= 0)
  System.out.println("Boom!");
 else
 {
  System.out.println(x);
  print3(x - 1);
  System.out.println(x);
 }
}
स्क्रीन आउटपुट: स्क्रीन आउटपुट:
3
2
1
Boom!
1
2
3
3
2
1
Boom!
1
2
3

"ठीक आहे. मला वाटते की मला समजले आहे. आम्हाला पुनरावृत्तीची आवश्यकता का आहे?"

"अनेक, अनेक कार्ये आहेत जी मूळ कार्याप्रमाणेच वेगळ्या उपकार्यांमध्ये विभागली जाऊ शकतात. उदाहरणार्थ, तुम्हाला XML झाडाच्या सर्व घटकांमधून चालणे आवश्यक आहे. प्रत्येक घटकामध्ये अनेक मूल घटक असू शकतात आणि त्यांच्याकडे त्यांचे स्वतःचे मूल घटक."

"किंवा तुम्हाला डिरेक्टरीमध्ये असलेल्या फाइल्सची सूची आणि त्याच्या सर्व उपडिरेक्टरी प्रदर्शित करणे आवश्यक आहे. म्हणून तुम्ही एक पद्धत लिहा जी सध्याच्या डिरेक्टरीच्या फाइल्स प्रदर्शित करते. नंतर सर्व उपडिरेक्टरींच्या फाइल्स मिळविण्यासाठी, तुम्ही तुमची पद्धत वापरून कॉल करा. भिन्न युक्तिवाद: उपनिर्देशिका."

"उदाहरणार्थ:"

सर्व फाइल्स डिरेक्टरी आणि त्याच्या उपडिरेक्टरीमध्ये प्रदर्शित करा
public static void main(String[] args)
{
 printAllFiles(new File("c:/windows/"));
}

public static void printAllFiles(File dir)
{
 for (File file : dir.listFiles())
 {
  if (file.isDirectory())
   printAllFiles(file);
  else
   System.out.println(file.getAbsolutePath());
 }
}

"ओळ 8 - आम्हाला dir निर्देशिकेतील सर्व फाईल्सची (आणि निर्देशिका) यादी मिळते."

"लाईन्स 10-11 - जर फाइल खरोखर एक निर्देशिका असेल, तर आम्ही पुन्हा printAllFiles कॉल करतो , परंतु यावेळी दुसर्या युक्तिवादासह: उपनिर्देशिका."

"ओळ 13 - आम्ही सध्याच्या फाइलचे नाव प्रदर्शित करतो."

"ठीक आहे. मला समजले आहे. धन्यवाद, बिलाबो."