বেজায় গরম। গাছতলায় দিব্যি ছায়ার মধ্যে চুপচাপ শুয়ে আছি, তবু ঘেমে অস্থির। ঘাসের উপর রুমালটা ছিল, ঘাম মুছবার জন্য যেই সেটা তুলতে গিয়েছি অমনি রুমালটা বলল “ম্যাও!” কি আপদ! রুমালটা ম্যাও করে কেন?

চেয়ে দেখি রুমাল তো আর রুমাল নেই, দিব্যি মোটা-সোটা লাল টকটকে একটা বেড়াল গোঁফ ফুলিয়ে প্যাট্ প্যাট্ করে আমার দিকে তাকিয়ে আছে!

আমি বললাম, “কি মুশকিল! ছিল রুমাল, হয়ে গেল একটা বেড়াল।”
সুকুমার রায়

৭ ফাংশন এবং জাদুর বাক্স

৭.১ ফাংশন কি?

ফাংশন একটা মহা মজার জিনিস। ফাংশনের আইডিয়াটা হচ্ছে একটা কালো জাদুর বাক্সের মতো। ধরো আমার একটা সুন্দর জাদুর বাক্স আছে যেটা দিয়ে আমি জাদু দেখাই। আমি যখন সেখানে একটা ব্যাঙকে ভরে ফেলি, তখন একটা রাজপূত্র বের হয়ে আসে। যখন একটা খরগোশ ভরি বাক্সে, তখন একটা প্রজাপতি বের হয়ে আসে। আর একটা পিঁপড়াকে ঢুকায়ে দিলে একটা হাতি বের হয়ে আসে।

জানো এই কনসেপ্টটাই হচ্ছে ফাংশন। ব্যাঙকে ঢুকালে সবসময়ই একটা রাজপূত্র বের হয়ে আসবে, কখনোই একটা হাতি বের হয়ে আসবে না। কিংবা খরগোশকে ঢুকালেও হাতি বের হয়ে আসবে না।

আমরা ফাংশনের আইডিয়াটা খুব ব্যবহার করি, কারণ ওই কালো জাদুর বাক্সের মতো করে ব্যাপারটা সহজ করে দেয়। আমরা জানি আমাদের একটা জাদুর বাক্স আছে, আর আমরা জানি সে কি কাজ করে - আমাদের ওর কাজটা প্রয়োজন, জাদুর বাক্সটা কিভাবে কাজটা করছে সেটা নিয়ে আমাদের খুব বেশি আগ্রহ নেই যতক্ষণ আমাদের কাজটা ঠিকঠাক শেষ হচ্ছে।

ফাংশনের আকৃতি সবসময় এরকম কিছু হয় y = f(x), যেখানে আগের উদাহরণটাতে f হচ্ছে আমার জাদুর বাক্স, x হচ্ছে আমার ব্যাঙ, y হচ্ছে আমার রাজপূত্র। যদি x পিঁপড়া হয়, তাহলে y হচ্ছে আমার হাতি। এখন ফাংশনটা কি হবে, সেটা হবে তুমি কিভাবে ফাংশনটাকে define করছো সেটা।

ধরো এটা হচ্ছে একটা ফাংশন যেটা সব সময় সংখ্যাটার বর্গ বের করে দেবে

এখানে আমার জাদুর বাক্সটা হচ্ছে square আর আমি x কে ঢুকাচ্ছি আর x এর বর্গ বের হয়ে আসছে।

৭.২ ফাংশনের কাজগুলো

৭.২.১ সহজ মানুষ

ফাংশন আমরা ব্যবহার করি মূলত কোডগুলোকে সহজ করার জন্য। যেমন ধরো কেউ যদি লিখে

তখন পুরো কোডটা না পড়েও তুমি শুধু এইটুকু পড়েই বুঝতে পারবে যে এখানে দুই থেকে একশ পর্যন্ত সবগুলো মৌলিক সংখ্যাকে প্রিন্ট করা হচ্ছে। কিন্তু যদি আমি লিখতাম

তাহলে তোমার বুঝতে আরেকটু সময় লাগতো।

To understand recursion, you first need to understand recursion.
Anonymous

৭.২.২ রিকার্শন

কিন্তু ফাংশনের আরেকটা খুব আশ্চর্যরকমের ব্যবহার আছে। সেটাকে বলে রিকার্শন। রিকার্শন খুবই অসাধারণ একটা জিনিস। ভয়ংকর রকমের বস একটা জিনিস। একটা কথা ছিলো এরকম - To Iterate is Human, to Recurse, Divine. কারণ রিকার্শন দিয়ে খুব elegant সলুশন লেখা সম্ভব। ভয়ংকর elegant সলুশন লেখা সম্ভব, সেগুলো দেখে তোমার মনে হবে - তুমি কোড দেখছো না, তুমি কবিতা দেখছো। আরো হয়কি, রিকার্শন দেখলে প্রবলেমটার একটা পরিষ্কার রূপ চোখে পড়ে - সেটা খুব সুন্দর একটা ব্যাপার।

তোমাকে elegant কিছু দেখানোর আগে আমি সহজ কিছু দেখাই। রিকার্শন মানে আসলে খুব সহজ - যখন একটা ফাংশন তার নিজেকে call করে, সেটাকে আমরা বলি রিকার্শন। ধরো ফ্যাকটোরিয়ালের সংজ্ঞা হচ্ছে

যদি x == 1 হয়
  তাহলে factorial(x) = 1
  নাহলে factorial(x) = x * factorial( x - 1 )

আমি আরেকটু ভেঙে দেখাই -

factorial( 5 ) = 5 x 4 x 3 x 2 x 1, তাই না?
factorial( 4 ) = 4 x 3 x 2 x 1

তাহলে আমরা লিখতেই পারি,

factorial( 5 ) = 5 x factorial( 4 )

তো যদি আমরা কোড লিখি তাহলে দেখো

এই কোডটাতে x এর ফ্যাক্টোরিয়াল বের করার জন্য আবার আমাদের একই ফাংশনটাকে কল করতে হচ্ছে x-1 এর জন্য। তো যখন একটা ফাংশন তার নিজেকে ডাকে তখন আমরা সেটাকে বলি রিকার্শন।

আমি তোমাকে আরেকটা ছোট্ট উদারহণ দেই। তোমার মনে আছে আমরা কিভাবে গ.সা.গু (গরিষ্ঠ সাধারণ গুননীয়ক - greatest common divisor) বের করতাম?

ধরো আমার ৩৩ আর ১২ আছে।

আমরা এরকম কিছু করতাম ছোটটাকে দিয়ে বড়টা ভাগ করতাম, তারপর ভাগশেষটাকে ছোট বানাতাম আর ছোটটাকে বড় বানাতাম, এভাবে চলতে থাকতাম যতক্ষণ না আমরা শূন্য ভাগশেষ পাচ্ছি, মানে ছোটটা শূণ্য হচ্ছে।

১২ দিয়ে ৩৩ কে ভাগ করলে ভাগশেষ থাকে ৯
৯ দিয়ে ১২ কে ভাগ করলে ভাগশেষ থাকে ৩
৩ কে দিয়ে ৯ কে ভাগ করলে ভাগশেষ থাকে ০

তার মানে হচ্ছে ৩ হচ্ছে সবচে' বড় সংখ্যা যারা ১২ আর ৩৩ কে নি:শেষে ভাগ করতে পারে। তো এটা যদি আমরা কোড দিয়ে লিখি তাহলে কোড টা হবে এরকম

ঠিক এই জিনিসটা রিকার্শনে দেখতে এরকম লাগবে

কিউট না? আমি জানি তুমি হা করে বোঝার চেষ্টা করছো। সেই জন্য আমি তোমাকে বলবো না এটা কিভাবে কাজ করছে!

I say with Didacus Stella, a dwarf standing on the shoulders of a giant may see farther than a giant himself.
Robert Burton

৭.৩ লাইব্রেরি ফাংশন

মনে আছে, আমি শুরুতে বলছিলাম - যে মানুষের জীবনটা খুব বেশি ছোট্ট বোরিং সব কাজ করার জন্য? প্রোগ্রামাররা একদমই বোরিং কাজ করতে চায় না। তো ওরা করে কি, যখনই দেখে যে অন্য আরেকজন প্রোগ্রামার কিছু একটা লিখে রেখেছে যেটা ওর লাগবে, সে সেটা ব্যবহার করে। এই জিনিসগুলোকে আমরা বলি লাইব্রেরী। প্রোগ্রামাররা সাধারণত খুব দারুণ টাইপের মানুষ হয় - তারা খুব খুশি হয় যখন তাদের কোন কাজ অন্য মানুষদের কাজে লাগে। সেজন্য তুমি দেখবা - মানুষজন খুব দারুণ সব লাইব্রেরী লিখে অনলাইনে ছেড়ে রেখেছে।

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

তো কোডটা হবে এরকম

এই raw_input() হচ্ছে একটা ফাংশন। সে করে কি ইউজারের কাছ থেকে ইনপুট নেয় আর সেটাকে রিটার্ন করে।

তারপর ধরো আমার দুইটা পূর্ণ সংখ্যা নিতে হবে, নিয়ে যোগ করে বলতে হবে যোগফল কত হলো। সেটা হবে এরকম

এখানে int ও একটা ফাংশন, সে করে কি কিছু ক্যারেক্টার নেয়, আর সেটা থেকে সংখ্যা বের করে সেটা রিটার্ন করে। মানে ধরো যদি আমি লিখি "123" এটাকে কিন্তু সে সংখ্যা ভাববে না - ভাববে এটা বোধহয় কারো নাম টাম হবে হয়তো। int করবে কি সেটা থেকে একটা নাম্বার বের করে রিটার্ন করবে।

তারপর ধরো আমরা প্রথমে যেই প্রোগ্রামটা লিখলাম না, একটা ত্রিভূজের আয়তক্ষেত্র বের করার? যদি তুমি ইউজারের কাছ থেকে ইনপুট নিতে চাও সেটা হবে এরকম -

এগুলো সব পাইথনের বিল্ট-ইন লাইব্রেরী ফাংশন। এই ফাংশনগুলোর লিস্ট তুমি পাবা এখানে - docs.python.org/library/functions.html । আর সবসময় তোমার যখনই কিছু লাগবে গুগল এ সার্চ করো। যেমন এটা লেখার আগে আমি কখনো কোন ইউজারের কাছ থেকে ইনপুট নিয়ে ক্ষেত্রফল বের করিনি। তো সেজন্য এটা লেখার আগে আমি গুগল করেছিলাম এটা লিখে - converting raw_input into floating point number।