রিকার্শন (Recursion)

Standard

প্রোগ্রামিং এর ক্ষেত্রে খুবই শক্তিশালী একটা টুল হচ্ছে রিকার্শন। রিকার্শনের মাধ্যমে আমরা অনেক বড় কোন ইটারেটিভ সমাধানকে খুব ছোট আকারে লেখতে পারি। আবার কিছু প্রবলেম আছে যেগুলো ইটারেটিভভাবে চিন্তা করা খুব কষ্টকর। সেগুলো রিকার্সিভ ভাবে চিন্তা করলে ইনটুইটিভ এবং সহজ সমাধান বের করা যায়। বিশেষ করে ডাইনামিক প্রোগ্রামিং এবং ডিভাইড অ্যান্ড কনকুয়ের প্রবমলেমগুলো সমাধান করার জন্য রিকার্শন একদম আদর্শ পন্থা। নবীনদের প্রায় সবারই প্রথম দিকে রিকার্শন বুঝতে খুব অসুবিধা হয়। এর মূল কারণ জিনিসটা ভিজুয়ালাইজ করা কঠিন। তবে ভিজুয়ালাইজ করতে পারলে এবং কিভাবে কাজ করে সে ব্যাপারে স্পষ্ট ধারনা হয়ে গেলে রিকার্শন অত্যন্ত মজার একটা বিষয়!

Continue reading

ফাংশন (Function)

Standard

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

Continue reading

ফ্লোটিং পয়েন্ট নাম্বার ও কিছু সমস্যা

Standard

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

Continue reading

অপারেটর ওভারলোড (Operator Overload)

Standard

C++ এর যত অপারেটর আছে, +, -, /, *, =, <, >, <=, >=, <<, >> ইত্যাদি সবগুলোই একেকটা ফাংশন। হ্যাঁ, C++ এ অপারেটরগুলো একেকটা ফাংশনের মত কাজ করে। অর্থাৎ, + অপারেটরটা আসলে int add(int a, int b) { return a+b; } এরকম একটা ফাংশন। বাস্তবে এতোটা সরল না, আমি কেবল বোঝানোর জন্য এতো সরল করে বললাম। তবে এভাবে চিন্তা করতে পারলেই হবে যে প্রত্যেকটা অপারেটর আসলে একটা ফাংশনের মত করে কাজ করে।

সম্পূর্ণ লেখা

ভেক্টর (STL – Vector)

Standard

সম্ভবত C++ Standard Template Library (STL) এর সবথেকে বেশি ব্যবহৃত কনটেইনারটি হল ভেক্টর। খুবই কাজের একটা জিনিস। খুব সাধারনভাবে বলতে গেলে, এটা অনেকটা অ্যারের মত। অ্যারেতে যেমন একটার পর একটা ভেরিয়েবল থাকে, তেমনি ভেক্টরেও তাই। একটার পর একটা সাজানো থাকে। আবার অ্যারেতে যেমন ইন্ডেক্স থাকে যেটা ব্যবহার করে সরাসরি ঐ ইন্ডেক্সের ভেরিয়েবল পাওয়া যায়, তেমনি ভেক্টরেও ইন্ডেক্স আছে এবং তা ঠিক একইভাবে অ্যারের মত করেই কাজ করে।

সম্পূর্ণ লেখা

কাউন্টিং সর্ট (Counting Sort)

Standard

আগের পর্বঃ বাবল সর্ট

সর্টিং এর জন্য যে সকল এলগোরিদম আছে তার মধ্যে সবচেয়ে এফিসিয়েন্ট হল কাউন্টিং সর্ট। এটি O(n) টাইম কমপ্লেক্সিটিতে কাজ করে! কেবল এফিসিয়েন্টই না, একই সাথে অত্যন্ত সহজও। আসলে একে আলাদা কোন এলগোরিদম না বললেও চলে। খুবই সাধারণ ধারণা দিয়েই কাজটি করে ফেলা যায়।

সম্পূর্ণ লেখা

বাবল সর্ট (Bubble Sort)

Standard

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

সম্পূর্ণ লেখা

সর্টিং এলগোরিদম (Sorting Algorithm)

Standard

Sortসর্ট করা হল সহজ বাংলায় সাজানো। এই সাজানোটা বিভিন্নভাবে হতে পারে। কি সর্ট করছি এবং কি কাজে সর্ট করছি তার উপর নির্ভর করে কিসের ভিত্তিতে এবং কিভাবে সর্ট করা হবে। এটি হতে পারে কতগুলো নাম্বারকে ছোট থেকে বড় ক্রমানুসারে (Ascending Order) সাজানো। হতে পারে বড় থেকে ছোট ক্রমানুসারে (Descending Order) সাজানো। যদি শব্দ সাজাতে হয় তাহলে হতে পারে বর্ণমালায় অক্ষরের ক্রমানুসারে সজ্জা।

সম্পূর্ণ লেখা

গ.সা.গু. এবং ল.সা.গু. (GCD and LCM)

Standard

গ.সা.গু. – গরিষ্ঠ সাধারণ গুণণীয়ক (GCD – Greatest Common Divisor)

দুটি নাম্বারের GCD হল নাম্বার দুটির ফ্যাক্টরগুলোর মধ্যে সবচেয়ে বড় কমন ফ্যাক্টরটি। আমরা জানি একটি নাম্বারের এক বা একাধিক ফ্যাক্টর থাকে। আমরা যদি দুটি নাম্বারের সবগুলো ফ্যাক্টর বের করি, এবং তাদের মধ্যে কমন ফ্যাক্টরগুলোকে আলাদা করি, তাহলে সেই কমন ফ্যাক্টরগুলোর মধ্যে সবচেয়ে বড়টিই হবে নাম্বার দুটির GCD।

সম্পূর্ণ লেখা

প্রাইম নাম্বার – বিট-ওয়াইজ সিভ (Prime Number – Bitwise Sieve)

Standard

আগের পর্বঃ প্রাইম নাম্বার – সিভ অফ এরাটস্থেনিজ

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

সম্পূর্ণ লেখা