পাইথন রিকার্সন কীভাবে ব্যবহার করবেন
পাইথন রিকার্সন বিগিনারদের জন্য একটি ভয়ঙ্কর টপিক। চলুন রিকার্সন ডিফাইন করে এই মিথ্যাটি দূর করি। রিকার্সন হল একটি প্রোগ্রামিং মেথড যেখানে একটি ফাংশন নিজেকে কল করে।
এটি সহজ লাগছে, ঠিক ন? যখন আপনি এটিকে হ্যাং অফ করবেন, রিকার্সন কোনো কঠিন কনসেপ্ট নহीं।
এই পাইথন টিউটোরিয়ালে, আমরা রিকার্সন এবং এটি কীভাবে কাজ করে সেটি আলোচনা করব। আমরা ফ্যাক্টোরিয়াল ফাংশন ব্যবহার করে রিকার্সনের একটি উদাহরণের মাধ্যমে যাব যাতে আপনি এই প্রোগ্রামিং মেথডের সাথে শুরু করতে পারেন।
রিকার্সন কী?
রিকার্সন হল আপনি কিছুকে নিজের কথায় ডিফাইন করা।
একটি রিকার্সিভ ফাংশন সমস্যা সমাধান করে বারবার নিজেকে কল করে। এই বিহেভি어를 অধিকাংশ মেজর প্রোগ্রামিং ভাষা সাপোর্ট করে, যেমন পাইথন। সেগুলো কম্পিউটার সাইন্স এবং ডেটা সাইন্সের একটি গুরুত্বপূর্ণ অংশ।
রিকার্সন তখন উপযোগী হয় যখন একটি সমস্যার সমাধান ছোট ছোট সমস্যাগুলোতে ভাঙে দিয়ে পাওয়া যায় যেগুলো সব একই ফর্মুলা ব্যবহার করে। এই টাইপের সমস্যাগুলো প্রায়শই "রিকার্সিভ অ্যালগরিদম" বলা হয়। সেগুলো সমাধান করার চাবি নামটিইতে রয়েছে!
ইটারেটিভ বনাম রিকার্সিভ
একটি অ্যালগরিদম সমাধান করার দুটি উপায় রয়েছে: ইটারেটিভলি বা রিকার্সিভলি।
অ্যালগরিদমের ইটারেটিভ সমাধানগুলোক "শক্তিশালী কিন্তু বদসূরত" মনে করা হয়। সেগুলো কাজটি করে ফেলে, কিন্তু সেগুলো সেটি সবচেয়ে এলিগেন্ট উপায়ে করে না। রিকার্সিভ অ্যালগরিদম ভালোভাবে বুঝতে, আমাদের ইটারেটিভ ফাংশনগুলো দেখতে হবে।
একটি ইটারেটিভ ফাংশন হল এমন একটি ফাংশন যা একটি লুপ ব্যবহার করে একটি সমস্যা সমাধান করে। এটি লুপ কমপ্লিট না হওয়া পর্যন্ত লুপের ভিতরের কোড এক্সিকিউট করবে। একটি রিকার্সিভ ফাংশন হল এমন একটি ফাংশন যা একটি সমস্যাকে ছোট ছোট অংশে ভাঙে দেয় এবং নিজেকে কল করে প্রতিটি অংশ সমাধান করে।
ফ্যাক্টোরিয়ালস: ইটারেটিভ উদাহরণ
ফ্যাক্টোরিয়ালস রিকার্সন এবং ইটারেটিভ চিন্তা ডেমোন্সট্রেট করার একটি ভালো উপায়। ম্যাথে, ফ্যাক্টোরিয়ালস হল একটি সংখ্যা এবং তার আগের সব সংখ্যা একসাথে গুণফলের যোগফল।
৫-এর ফ্যাক্টোরিয়াল সমান ৫ * ৪ * ৩ * ২ * ১। ২-এর ফ্যাক্টোরিয়াল সমান ২ * ১।
একটি ফ্যাক্টোরিয়াল ক্যালকুলেট করতে, আমরা একটি ইটারেটিভ ফাংশন লিখতে পারি:
def factorial(number):
total = 1
for n in range(1, number + 1):
total = total * n
return total
এই ফাংশনটি একটি for লুপ ব্যবহার করে ১ এবং আমরা যে সংখ্যাটি স্পেসিফাই করেছি তার প্লাস ১ পর্যন্ত রেঞ্জের সব সংখ্যার মাধ্যমে ইটারেট করে। প্রতিটি ইটারেশনের জন্য, লুপ যে সংখ্যার ওপর ইটারেট করছে সেটি টোটালের সাথে গুণ করা হয়। চলুন আমাদের ফাংশন কল করি ফ্যাক্টোরিয়াল খুঁজে বের করতে:
answer = factorial(4) print(answer)
আমাদের কোড রিটার্ন করে: 24। এই সমাধানে পৌঁছানোর জন্য, আমাদের কোড রান করে:
- 1 * 1 = 1
- 2 * 2 = 4
- 4 * 3 = 8
- 8 * 4 = 24
আপনি দেখতে পাচ্ছেন, আমাদের কোড ৪ কে তার চেয়ে ছোট সব সংখ্যার সাথে গুণ করে এবং তারপর নিজের সাথে।
এই কোড ফাংশনাল। একমাত্র ড্রব্যাক হল এটি সেটা হতে পারে তত এলিগেন্ট নহीं। সেটিই যেখানে রিকার্সিভ ফাংশনগুলো কাজে আসে।
ফ্যাক্টোরিয়ালস: রিকার্সন উদাহরণ
চলুন একটি রিকার্সিভ ফাংশন লিখি যা একটি ফ্যাক্টোরিয়াল ক্যালকুলেট করে। একটি নতুন পাইথন ফাইল খুলুন এবং নিচের কোডটি পেস্ট করুন:
def factorial(number):
if number == 1:
return 1
else:
return (number * factorial(number - 1))
এই কোডটি রিকার্সিভ পদ্ধতি ব্যবহার করে। যখন এই ফাংশনটি রান হয়, একটি "if" স্টেটমেন্ট এক্সিকিউট হয়। এই স্টেটমেন্টটি চেক করে ফাংশনে পাস করা সংখ্যা ১-এর সমান কিনা। যদি হ্যাঁ, আমাদের ফাংশন ১ রিটার্ন করে। অন্যথায়, আমাদের সংখ্যার ফ্যাক্টোরিয়াল ক্যালকুলেট করা হয়।
এই ক্যালকুলেশনটি ফাংশনে পাস করা সংখ্যাকে পূর্ববর্তী সংখ্যার ফ্যাক্টোরিয়ালের সাথে গুণ করে কাজ করে। এই ফাংশনটি বারবার কল হয় যতক্ষণ না "number" ১-এর সমান হয়। প্রতিবার ফাংশন কল হলে, "number" এর মান ১ কমে যায়।
চলুন আমাদের কোডকে ৪ নম্বারের সাথে ট্রাই করি:
answer = factorial(4) print(answer)
উত্তর ২৪ রিটার্ন হয়েছে। আমাদের উত্তর সঠিক; এটি আমাদের লাস্ট উদাহরণের মতোই। আমরা এই সমস্যার সমাধান রিকার্সিভলি খুঁজে পেয়েছি ইটারেটিভলি না।
আপনাকে এখনও একটু সাহায্য দরকার? চলুন রিকার্সনের আরেকটি উদাহরণের মাধ্যমে যাই।
ফিবোনাচি সিকোয়েন্সের সাথে রিকার্সন
ফিবোনাচি সিকোয়েন্স হল একটি ম্যাথমেটিক্যাল সিকোয়েন্স যেখানে প্রতিটি সংখ্যা পূর্ববর্তী দুটি সংখ্যার যোগফল। এই সিকোয়েন্সটি শুরু হয়: 0, 1, 1, 2, 3, 5, 8, 13, এবং এভাবে।
এই সিকোয়েন্সটি পরবর্তী সংখ্যা খুঁজে বের করতে দুটি সংখ্যা যোগ করে। এটিকে রিকার্সনের জন্য আইডিয়াল করে তোলে।
একটি পাইথন ফাইল খুলুন এবং এই কোডটি পেস্ট করুন:
def fibonacci(number):
if number <= 1:
return number
else:
return(fibonacci(number - 1) + fibonacci(number - 2))
এই কোডটি একটি লিস্টে দুইটি পূর্ববর্তী সংখ্যার যোগফল ক্যালকুলেট করবে, যতক্ষণ না "number" ১-এর বেশি হয়। অন্যথায়, "number is returned"। এখন, চলুন আমাদের ফাংশন কল করি:
executions = 5
print("Fibonacci Sequence:")
for number in range(executions):
print(fibonacci(number))
executions ভেরিয়েবলটি ট্র্যাক করে আমরা ফিবোনাচি সিকোয়েন্সে কতগুলো সংখ্যা ক্যালকুলেট করতে চাই। আমরা এটি একটি for লুপ তৈরি করতে ব্যবহার করি যা আমাদের fibonacci() ফাংশনকে ১ এবং "executions" এর মান পর্যন্ত রেঞ্জের প্রতিটি সংখ্যার জন্য কল করে।
আমাদের for লুপ শুরু হওয়ার আগে, আমরা "Fibonacci Sequence:" কনসোলে প্রিন্ট করি। এই উদাহরণে, আমাদের "for" লুপ এক্সিকিউট করে:
fibonacci(1) fibonacci(2) fibonacci(3) fibonacci(4) fibonacci(5)
চলুন আমাদের কোড সব মিলিয়ে রান করি এবং দেখি কী হয়:
Fibonacci Sequence: 0 1 1 2 3
আমাদের কোড ফিবোনাচি সিকোয়েন্সের প্রথম পাঁচটি সংখ্যা ক্যালকুলেট করে। আমরা "executions" এর মান বাড়িয়ে আরও অনেক সংখ্যা ক্যালকুলেট করতে পারি।
রিকার্সন ডেপথ এবং বেস কন্ডিশন
একটি রিকার্সিভ ফাংশনের একটি বেস কন্ডিশন থাকতে হবে। এটি একটি কন্ডিশন যা রিকার্সনটি রোকে দেয় যখন একটি নির্দিষ্ট বেস কেস মেট হয়। বেস ফাংশন ছাড়া, একটি ইনফিনিট লুপ তৈরি হবে।
একটি রিকার্সিভ ফাংশন ডিফল্টভাবে ১,০০০ বারও বেশি নিজেকে এক্সিকিউট করতে পারে না। একবার এই লিমিট পৌঁছালে, এররটি এরকম দেখায়:
RecursionError: maximum recursion depth exceeded
এখানে আমাদের ফিবোনাচি প্রোগ্রামের বেস কন্ডিশন:
...
if number <= 1:
return number
…
এই কন্ডিশনটি চেক করে আমাদের ফিবোনাচি প্রোগ্রামের ভিতরে "number" এর মান ১-এর সমান বা কম কিনা। যদি হ্যাঁ, "number" এর মান রিটার্ন করা হয়; অন্যথায়, রিকার্সিভ ফাংশন শুরু হয়।
কেন আমি রিকার্সন ব্যবহার করব?
ইটারেটিভ ফাংশনের চেয়ে রিকার্সন ব্যবহারের সুবিধা কী? টেকনিক্যালি, দুটি মেথডই একই রেজাল্ট অর্জন করতে পারে। রিকার্সনের সুবিধা হল এটি পড়া সহজ।
যখন আপনি একটি রিকার্সিভ ফাংশন দেখেন, এটি স্পষ্ট হয় যে একটি সমস্যার সমাধান সেটিকে ছোট ছোট অংশে ভাঙে দিয়ে পাওয়া যায়। ইটারেটিভ লুপগুলো কখনো কখনো দ্রুত হতে পারে, কিন্তু রিকার্সিভ ফাংশনগুলো সাধারণত তাদের রিডেবিলিটির কারণে পছন্দ করা হয়।
কারণ রিকার্সিভ ফাংশনগুলো পড়া সহজ, সেগুলো মেইনটেইন এবং ডিবাগ করাও সহজ। এটি বিশেষ করে উপযোগী যখন আপনি জটিল অ্যালগরিদম লিখছেন যা বোঝা কঠিন হতে পারে।
উপসংহার
একটি রিকার্সিভ ফাংশন হল এমন একটি ফাংশন যা নিজেকে কল করে একটি সমস্যার সমাধান খুঁজে বের করতে।
রিকার্সিভ ফাংশন একটি সমস্যাকে একাধিক অংশে ভাঙে দেয় এবং প্রতি ইটারেশনে সমস্যার একটি অংশ সমাধান করে। রিকার্সিভ ফাংশন সাধারণত ফ্যাক্টোরিয়াল এবং ফিবোনাচি সিকোয়েন্সের সংখ্যা ক্যালকুলেট করতে ব্যবহৃত হয়। সেগুলো অনেক অ্যালগরিদমেও ব্যবহৃত হয়।
এখন আপনি পাইথনে রিকার্সিভ ফাংশন নিয়ে কাজ করার জন্য রেডি।