loop/recur এর মাধ্যমে Tail-Recursive Looping
ক্লোজারে (Clojure) tail-recursive looping বাস্তবায়ন করার জন্য loop এবং recur ব্যবহার করা হয়। এই দুটি ফাংশন একসাথে কাজ করে এবং tail recursion এর সুবিধা প্রদান করে, যেখানে রিকার্সিভ কলের শেষ অংশে কোনো অতিরিক্ত কাজ থাকে না, ফলে মেমোরি ব্যবহার সাশ্রয়ী হয় এবং স্ট্যাক ওভারফ্লো এর ঝুঁকি কমে।
loop/recur কী?
loop: এটি একটি লুপের মতো ব্যবহৃত হয়, যা নির্দিষ্ট সংখ্যা বা শর্ত পূর্ণ না হওয়া পর্যন্ত পুনরাবৃত্তি করতে সাহায্য করে। এটি চলতে থাকা প্রোগ্রাম কনট্রোলের জন্য কিছু স্থির মান বা অবস্থান নির্ধারণ করে।recur: এটিloopবা রিকার্সিভ ফাংশনের মধ্যে নিজেকে পুনরায় কল করতে ব্যবহৃত হয়। এটি স্ট্যাক ওভারফ্লো সমস্যা ছাড়া কার্যকরীভাবে টেইল রিকার্সন তৈরি করতে সাহায্য করে, কারণrecurকোনো নতুন স্ট্যাক ফ্রেম তৈরি না করে বর্তমান ফ্রেমে কাজ চালিয়ে যায়।
loop এবং recur এর মাধ্যমে Tail-Recursive Looping উদাহরণ
উদাহরণ: ফ্যাক্টরিয়াল গণনা
(defn factorial [n]
(loop [acc 1
num n]
(if (<= num 1)
acc
(recur (* acc num) (dec num)))))এখানে loop দিয়ে একটি লুপ শুরু করা হয়েছে এবং recur এর মাধ্যমে ফাংশনকে আবার কল করা হয়েছে, কিন্তু কোনো নতুন স্ট্যাক ফ্রেম তৈরি না করে। acc একটি অ্যাকিউমুলেটর (accumulator) হিসেবে কাজ করছে, যা ফ্যাক্টরিয়াল গণনার জন্য আগের ফলাফলের সাথে বর্তমান মানকে গুণ করছে। এইভাবে, শেষের রিকার্সন কলের পর কোনো অতিরিক্ত কাজ হয় না, এবং মেমোরি ব্যবহার দক্ষ থাকে।
ব্যাখ্যা:
loopএর মধ্যেaccএবংnumনামের দুটি ভ্যারিয়েবল নির্ধারণ করা হয়েছে।accহচ্ছে ফ্যাক্টরিয়াল গণনার জন্য ইনিশিয়াল মান, এবংnumহচ্ছে ডেটার বর্তমান মান।- শর্ত
(<= num 1)চেক করা হচ্ছে, যদিnum1 এর সমান বা ছোট হয়, তবেaccরিটার্ন করা হবে, অন্যথায়recurদিয়ে পুনরায় কল করা হবে। recurপরবর্তী রিকার্সন কলের জন্য অ্যাকিউমুলেটরaccআপডেট করে এবংnumএর মান 1 কমায়। এতে কোনো নতুন স্ট্যাক ফ্রেম তৈরি হয় না এবং এই কল বর্তমান ফ্রেমে সম্পন্ন হয়।
উদাহরণ: ফিবোনাচি সিরিজ
(defn fibonacci [n]
(loop [a 0
b 1
count n]
(if (<= count 0)
a
(recur b (+ a b) (dec count)))))এখানে loop এবং recur এর মাধ্যমে ফিবোনাচি সিরিজ গণনা করা হচ্ছে। a এবং b ফিবোনাচি সিরিজের আগের দুটি মান, এবং count হলো ফিবোনাচি সংখ্যার অবস্থান।
ব্যাখ্যা:
loop-এ তিনটি ভ্যারিয়েবল:a,b, এবংcountব্যবহৃত হচ্ছে।aএবংbফিবোনাচি সিরিজের দুটি আগের মান, এবংcountবাকি পদ সংখ্যা।- শর্ত
(<= count 0)চেক করা হয়, যদিcount0 বা তার চেয়ে ছোট হয়, তখনaরিটার্ন করা হয়, যা ফিবোনাচি সংখ্যার মান। recurপরবর্তী রিকার্সন কলের জন্যaএবংbএর মান আপডেট করে, এবংcountএর মান 1 কমায়।
loop/recur এর সুবিধা
- মেমোরি দক্ষতা:
recurএর মাধ্যমে কোনো নতুন স্ট্যাক ফ্রেম তৈরি না হওয়ায়, মেমোরি ব্যবহারের সমস্যা যেমন স্ট্যাক ওভারফ্লো এড়ানো যায়। - স্ট্যাক ওভারফ্লো থেকে মুক্তি: রিকার্সন সাধারণত গভীর স্ট্যাক ফ্রেম তৈরি করতে পারে, কিন্তু
loopএবংrecurএর মাধ্যমে তা কমিয়ে দেয়। - পুনঃব্যবহারযোগ্য কোড: এই কৌশলটি ফাংশনাল প্রোগ্রামিংয়ে কোড পুনঃব্যবহারযোগ্য এবং আরও কার্যকরী করে তোলে।
সারসংক্ষেপ
| বৈশিষ্ট্য | loop/recur | সাধারণ রিকার্সন |
|---|---|---|
| স্ট্যাক ব্যবস্থাপনা | স্ট্যাক ফ্রেম পুনঃব্যবহার করে | প্রতিটি রিকার্সন কল নতুন স্ট্যাক ফ্রেম তৈরি করে |
| কার্যক্ষমতা | মেমোরি সাশ্রয়ী এবং কার্যকর | গভীর রিকার্সনে স্ট্যাক ওভারফ্লো হতে পারে |
| বৈশিষ্ট্য | টেইল রিকার্সন, মেমোরি দক্ষ | স্ট্যাক ওভারফ্লো ঝুঁকি এবং কম কার্যক্ষম |
ক্লোজারে loop এবং recur ব্যবহার করে tail-recursive looping একটি শক্তিশালী কৌশল, যা মেমোরি ব্যবহার সাশ্রয়ী এবং কার্যক্ষমভাবে পুনরাবৃত্তি সম্পাদন করতে সাহায্য করে।
Read more