"হাই, আমিগো। আজ বিলাবো তোমাকে রিকারশনের কথা বলবো।"

পুনরাবৃত্তি - 1

আপনি জানেন, জাভাতে কিছু পদ্ধতি অন্য পদ্ধতিকে কল করে। অতিরিক্তভাবে, যখন একটি পদ্ধতি কল করা হয়, তখন নির্দিষ্ট আর্গুমেন্টগুলি এতে প্রেরণ করা হয়, তবে পদ্ধতির স্থানীয় ভেরিয়েবলগুলি এটি চালানোর সময় নির্দিষ্ট মান নেয়।

"আহ হাহ."

"এবং আপনি যেমন জানেন, বিভিন্ন পদ্ধতির অভ্যন্তরীণ ভেরিয়েবল একে অপরের থেকে স্বাধীন।"

"আহ হাহ."

"সুতরাং পরিস্থিতি কল্পনা করুন যেখানে একটি পদ্ধতি নিজেকে কল করে। একে বলা হয় পুনরাবৃত্তি। উদাহরণস্বরূপ:"

উদাহরণ
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 - যদি ফাইলটি আসলে একটি ডিরেক্টরি হয়, তাহলে আমরা আবার প্রিন্টঅলফাইলসকে কল করি , কিন্তু এবার আরেকটি যুক্তি দিয়ে: সাবডিরেক্টরি।"

"লাইন 13 - আমরা বর্তমান ফাইলের নাম প্রদর্শন করি।"

"ঠিক আছে। আমি মনে করি আমি বুঝতে পেরেছি। ধন্যবাদ, বিলাবো।"