পাইথনে রিকার্শন

প্রোগ্রামিংয়ে একটি ধারণা রয়েছে, যাকে বলা হয় রিকার্শন - যখন একটি ফাংশন নিজেকে কল করে।

উদাহরণ . কাউন্টার সহ সহজ রিকার্শন

রিকার্শন ব্যবহার করে 1 থেকে 10 পর্যন্ত সংখ্যাগুলি আউটপুট করা যাক:

pythoni = 1

def func():
  global i
  print(i)
  i += 1
  
  if i <= 10:
    func() # এখানে ফাংশন নিজেকে কল করছে
    
  func()

এই কোডটি কীভাবে কাজ করে তা আলোচনা করা যাক।

আমাদের একটি গ্লোবাল ভেরিয়েবল i এবং একটি ফাংশন func রয়েছে, যার ভিতরে i ভেরিয়েবলের বিষয়বস্তু কনসোলে আউটপুট করা হয়, এবং তারপর এটিতে এক যোগ করা হয়।

যদি আমাদের i ভেরিয়েবল 10 এর থেকে কম বা সমান হয়, তাহলে ফাংশনটি আবার কল করা হয়। যেহেতু i ভেরিয়েবলটি গ্লোবাল, তাই ফাংশনের প্রতিটি নতুন কলের সময় এতে i ভেরিয়েবলের পূর্ববর্তী কল দ্বারা নির্ধারিত মান থাকবে।

ফলস্বরূপ, ফাংশনটি নিজেকে তখন পর্যন্ত কল করতে থাকবে যতক্ষণ না i 10 এর বেশি না হয়।

মনে রাখবেন, আমাদের ক্ষেত্রে if ছাড়া ফাংশন চালানো যায় না - যদি এটি করা হয়, তাহলে ফাংশনের অসীম কল হবে।

উদাহরণ . নেস্টেড লিস্টের উপাদান আউটপুট করার জন্য রিকার্শন

রিকার্শন প্রায়শই বিভিন্ন লেভেলের নেস্টেড লিস্ট ঘাঁটার জন্য ব্যবহৃত হয়। আমাদের নিম্নলিখিত লিস্টটি রয়েছে:

pythonlst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]

এটি ঘাঁটার জন্য একটি ফাংশন তৈরি করা যাক। এটিতে প্রথমে একটি শর্ত সেট করতে হবে, যাতে একটি প্রিমিটিভ উপাদান, অর্থাৎ লিস্ট থেকে সরাসরি নেওয়া সংখ্যা, কনসোলে আউটপুট হয়। এবং যদি উপাদানটি একটি জটিল অবজেক্ট হয়, উদাহরণস্বরূপ একটি নেস্টেড লিস্ট, তাহলে এই ক্ষেত্রে ফাংশনটি নিজেকে কল করবে, অর্থাৎ রিকার্শন ঘটবে। উপাদানের টাইপ চেক করার জন্য isinstance ফাংশন ব্যবহার করা যাক। শুধুমাত্র আমাদের উদাহরণের জন্য isinstance এর প্রথম প্যারামিটারে el লিখব, এবং দ্বিতীয়টিতে টাইপ list লিখব:

pythondef func(lst):
  for el in lst:
    if isinstance(el, list):
      func(el)
    else:
      print(el)

ফাংশন কল করলে নেস্টেড লিস্টের সমস্ত সংখ্যা একটি সারিতে আউটপুট হবে:

pythonfunc(lst) # 1, 2, ... 8, 9 আউটপুট করবে

উদাহরণ . নেস্টেড লিস্টের উপাদানগুলির সাথে অপারেশনের জন্য রিকার্শন

নেস্টেড লিস্টের উপাদানগুলির সাথে বিভিন্ন অপারেশনের জন্যও রিকার্শন প্রয়োগ করা যেতে পারে। আমাদের নিম্নলিখিত লিস্টটি রয়েছে:

pythonlst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]

এর সমস্ত উপাদানের যোগফল বের করা যাক। এর জন্য ফাংশনের মধ্যে একটি res ভেরিয়েবল ডিক্লেয়ার করব, যেখানে সংখ্যার যোগফল জমা হবে। শর্তে লিখব যে, যদি উপাদানটি একটি জটিল অবজেক্ট হয়, তাহলে এটি func ফাংশনের প্যারামিটারে যাবে এবং যোগফলের সাথে যোগ হবে। এর মানে হল যে, উপাদানটি প্রিমিটিভ না হওয়া পর্যন্ত রিকার্শনে থাকবে। এবং এই ক্ষেত্রে এটি শুধু res-এ লেখা যোগফলের সাথে যোগ হবে:

pythondef func(lst):
  res = 0
  for el in lst:
    if isinstance(el, list):
      res += func(el)
    else:
      res += el
  return res

ফাংশনটি কল করা যাক এবং এর ফলাফল কনসোলে আউটপুট করা যাক:

pythonprint(func(lst)) # 45 আউটপুট করবে

উদাহরণ . লিস্টে জমা করার জন্য রিকার্শন

রিকার্শন ব্যবহার করে নেস্টেড লিস্টগুলিকে একটি এক-মাত্রিক লিস্টে ভাঙ্গা যেতে পারে। আমাদের নিম্নলিখিত লিস্টটি রয়েছে:

pythonlst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]

ফাংশনে একটি খালি লিস্ট res লিখব, যেখানে মূল লিস্টের উপাদানগুলি জমা হবে। এরপর একটি লুপ চালু করব এবং একটি শর্ত সেট করব - যদি উপাদানটি একটি লিস্ট হয়, তাহলে এটি extend মেথডে যাবে। এই মেথডটি একটি লিস্টের উপাদানগুলি অন্য লিস্টের শেষে সংযুক্ত করে, অর্থাৎ নেস্টেড লিস্টের উপাদানগুলি res লিস্টের শেষে চলে যাবে:

pythondef func(lst):
  res = []
  for el in lst:
    if isinstance(el, list):
      res.extend(func(el))
    else:
      res.append(el)
  return res
  
print(func(lst))

সম্পাদিত কোডের ফলাফল:

python[1, 2, 3, 4, 5, 6, 7, 8, 9]

ব্যবহারিক সমস্যা

Задание 1

একটি অভিধানের সমস্ত সংখ্যাসূচক উপাদান যেকোনো লেভেলের নেস্টিংয়ে আউটপুট করুন:

python{
  'a': {
    'b': 1,
    'c': 2,
    'd': {
      'e': 3,
      'f': 4
    }
  },
  'j': {
    'h': 5,
    'k': 6,
  },
  'l': 7
}
Задание 2

পূর্ববর্তী সমস্যা থেকে অভিধানের উপাদানগুলির যোগফল নির্ণয় করুন।

Задание 3

পূর্ববর্তী সমস্যা থেকে অভিধানের প্রিমিটিভ উপাদানগুলির একটি লিস্ট পান।