কম্পিউটার টিউটোরিয়াল

JavaScript-এ রিকারসন ব্যবহার করে অ্যারে থেকে অড ও ইভেন সংখ্যা আলাদা করা

ভূমিকা

এই আর্টিকেলে একটি রিকারসিভ ফাংশন লেখা হয়েছে যা কোনো লুপ (for, while, forEach, map ইত্যাদি) ব্যবহার না করে একটি অ্যারে থেকে অড (বিজোড়) এবং ইভেন (জোড়) সংখ্যাগুলো আলাদা করে একটি অবজেক্ট রিটার্ন করে।

সম্পূর্ণ কোড

const arr = [12, 4365, 76, 43, 76, 98, 5, 31, 4];

const pushRecursively = (arr, len = 0, odd = [], even = []) => {
  if (len < arr.length) {
    arr[len] % 2 === 0 ? even.push(arr[len]) : odd.push(arr[len]);
    return pushRecursively(arr, ++len, odd, even);
  }
  return { odd, even };
};

console.log(pushRecursively(arr));
// আউটপুট: { odd: [4365, 43, 5, 31], even: [12, 76, 76, 98, 4] }

কোড ব্যাখ্যা

  • বেস কেস: `len < arr.length` না হলে রিকারশন বন্ধ, অবজেক্ট রিটার্ন
  • রিকারসিভ কেস: বর্তমান এলিমেন্ট চেক করুন, অড/ইভেন অনুয اللَّهে পুশ করুন
  • প্যারামিটার: `len` (কারেন্ট ইন্ডেক্স), `odd`/`even` (অ্যাকুমুলেটর অ্যারে)
  • ডিফল্ট প্যারামিটার: প্রাথমিক কলের জন্য ডিফল্ট ভ্যালু

রিকারশন ফ্লো (ট্রেস)

pushRecursively([12, 4365, 76], 0, [], [])
→ pushRecursively([12, 4365, 76], 1, [], [12])
→ pushRecursively([12, 4365, 76], 2, [4365], [12])
→ pushRecursively([12, 4365, 76], 3, [4365], [12, 76])
→ return { odd: [4365], even: [12, 76] }

আউটপুট

{ odd: [4365, 43, 5, 31], even: [12, 76, 76, 98, 4] }

⚠️ সতর্কতা: টেইল কল অপ্টিমাইজেশন (TCO)

JavaScript-এ (বিশেষ করে ব্রাউজারে) **টেইল কল অপ্টিমাইজেশন (TCO) স্ট্যান্ডার্ড নয়**। বড় অ্যারে (১০০০০+ এলিমেন্ট) এর জন্য এই রিকারসিভ পদ্ধতি **স্ট্যাক ওভারফ্লো** দিতে পারে।

আধুনিক ও সুরক্ষিত পদ্ধতিগুলো

১. ইটারেটিভ (প্রস্তাবিত - প্রোডাকশন রেডি)

const separateOddEven = (arr) => {
  const odd = [], even = [];
  for (const num of arr) {
    (num % 2 === 0 ? even : odd).push(num);
  }
  return { odd, even };
};

২. Reduce (ফাংশনাল, এক পাস)

const separateOddEven = (arr) => 
  arr.reduce((acc, num) => {
    (num % 2 === 0 ? acc.even : acc.odd).push(num);
    return acc;
  }, { odd: [], even: [] });

৩. Filter (দুই পাস, পঠনযোগ্য)

const separateOddEven = (arr) => ({
  odd: arr.filter(n => n % 2 !== 0),
  even: arr.filter(n => n % 2 === 0)
});

৪. রিকারসিভ + Trampoline (স্ট্যাক সেফ)

const trampoline = (fn) => (...args) => {
  let result = fn(...args);
  while (typeof result === 'function') {
    result = result();
  }
  return result;
};

const pushRecursivelySafe = (arr, len = 0, odd = [], even = []) => 
  len < arr.length
    ? () => pushRecursivelySafe(arr, len + 1, 
        arr[len] % 2 === 0 ? [...even, arr[len]] : odd,
        arr[len] % 2 === 0 ? even : [...odd, arr[len]])
    : { odd, even };

console.log(trampoline(pushRecursivelySafe)(arr));

সারাংশ

রিকারশন শেখার জন্য ভালো উদাহরণ, কিন্তু প্রোডাকশন কোডে **ইটারেটিভ বা রিডিউস** ব্যবহার করুন। TCO সাপোর্ট না থাকলে বড় ডেটায় স্ট্যাক ওভারফ্লো হবে।

  1. জাভাস্ক্রিপ্টে TypedArray.find() ফাংশন

  2. একটি নম্বর অ্যারে লিখুন এবং শুধু বিজোড় নম্বরগুলো যোগ করুন?

  3. জাভাস্ক্রিপ্টে ভ্যারিয়েবলটি অ্যারে কিনা যাচাই করার পদ্ধতি

  4. জাভাস্ক্রিপ্ট Array.find() ফাংশন