এটি নির্ভর করে আপনি "পুনরাবৃত্তি" কতটা কঠোরভাবে সংজ্ঞায়িত করেছেন তার উপর নির্ভর করে।
যদি আমাদের কল-স্ট্যাক (বা প্রোগ্রামের অবস্থা বজায় রাখার জন্য যে কোনও পদ্ধতি ব্যবহার করা হয়) জড়িত হওয়ার কঠোরভাবে প্রয়োজন হয়, তবে আমরা সর্বদা এটি এমন কিছু দিয়ে প্রতিস্থাপন করতে পারি যা না হয়। প্রকৃতপক্ষে, যে ভাষাগুলি প্রাকৃতিকভাবে পুনরাবৃত্তির ভারী ব্যবহারের দিকে পরিচালিত করে তাদের মধ্যে এমন সংকলক রয়েছে যা টেল-কল অপ্টিমাইজেশনের ভারী ব্যবহার করে, তাই আপনি যা লিখেন তা পুনরাবৃত্ত হয় তবে আপনি যা চালান তা পুনরাবৃত্তি হয়।
তবে এমন কোনও ক্ষেত্রে বিবেচনা করা যাক যেখানে আমরা পুনরাবৃত্তি কল করি এবং সেই পুনরাবৃত্ত কলটির জন্য পুনরাবৃত্তির কলটির ফলাফল ব্যবহার করি।
public static BigInteger Ackermann(BigInteger m, BigInteger n)
{
if (m == 0)
return n+1;
if (n == 0)
return Ackermann(m - 1, 1);
else
return Ackermann(m - 1, Ackermann(m, n - 1));
}
প্রথম পুনরাবৃত্ত কল পুনরাবৃত্তি করা সহজ:
public static BigInteger Ackermann(BigInteger m, BigInteger n)
{
restart:
if (m == 0)
return n+1;
if (n == 0)
{
m--;
n = 1;
goto restart;
}
else
return Ackermann(m - 1, Ackermann(m, n - 1));
}
আমরা তখন ক্লিন-আপ অপসারণ করতে পারেন goto
তাড়ান বন্ধ velociraptors এবং Dijkstra ছায়ায়:
public static BigInteger Ackermann(BigInteger m, BigInteger n)
{
while(m != 0)
{
if (n == 0)
{
m--;
n = 1;
}
else
return Ackermann(m - 1, Ackermann(m, n - 1));
}
return n+1;
}
তবে অন্যান্য পুনরাবৃত্ত কলগুলি সরাতে আমাদের কিছু কলগুলির মান একটি স্ট্যাকের মধ্যে সংরক্ষণ করতে হবে:
public static BigInteger Ackermann(BigInteger m, BigInteger n)
{
Stack<BigInteger> stack = new Stack<BigInteger>();
stack.Push(m);
while(stack.Count != 0)
{
m = stack.Pop();
if(m == 0)
n = n + 1;
else if(n == 0)
{
stack.Push(m - 1);
n = 1;
}
else
{
stack.Push(m - 1);
stack.Push(m);
--n;
}
}
return n;
}
এখন, যখন আমরা উত্স কোডটি বিবেচনা করি, আমরা অবশ্যই আমাদের পুনরাবৃত্ত পদ্ধতিটি পুনরাবৃত্তিতে পরিণত করেছি।
এটি কী সংকলিত হয়েছে তা বিবেচনা করে, আমরা এমন কোডটি পরিণত করেছি যা কল স্ট্যাক ব্যবহার করে কোডগুলিতে পুনরাবৃত্তি বাস্তবায়ন করতে ব্যবহার করে না (এবং এমনভাবে পরিণত কোড যা এমনকী ছোট ছোট মানগুলির জন্য স্ট্যাক-ওভারফ্লো ব্যতিক্রমকে কোডে ফেলে দেবে যা নিছকভাবে হবে ফিরে আসার জন্য একটি উদ্দীপনাজনকভাবে দীর্ঘ সময় নিন [দেখুন আমি কীভাবে আমার একারম্যান ফাংশনটিকে স্ট্যাকটি উপচে পড়া থেকে আটকাতে পারি? আরও কিছু আশাবাদ যা এটি আরও অনেক সম্ভাব্য ইনপুটগুলির জন্য আসলে ফিরে আসে]])
পুনরাবৃত্তি সাধারণত কীভাবে প্রয়োগ করা হয় তা বিবেচনা করে আমরা কল-স্ট্যাককে এমন কোডে পরিণত করেছি যা মুলতুবি অপারেশন ধরে রাখতে আলাদা স্ট্যাক ব্যবহার করে। সুতরাং আমরা তর্ক করতে পারি যে এটি এখনও পুনরাবৃত্ত হয়, যখন এটি নিম্ন স্তরে বিবেচনা করা হয়।
এবং সেই স্তরে, সত্যই এর চারপাশে অন্য কোনও উপায় নেই। সুতরাং আপনি যদি সেই পদ্ধতিটিকে পুনরাবৃত্ত বলে বিবেচনা করেন, তবে এমন কিছু জিনিস রয়েছে যা আমরা এগুলি ছাড়া করতে পারি না। সাধারণত যদিও আমরা এই জাতীয় কোড পুনরাবৃত্তির লেবেল করি না। পুনরাবৃত্তি শব্দটি কার্যকর কারণ এটি নির্দিষ্ট পদ্ধতির একটি নির্দিষ্ট সেটকে কভার করে এবং আমাদের সেগুলি সম্পর্কে কথা বলার একটি উপায় দেয় এবং আমরা এর মধ্যে আর একটি ব্যবহার করি না।
অবশ্যই, এই সমস্ত অনুমান করে আপনার একটি পছন্দ আছে। দুটি ভাষা রয়েছে যা পুনরাবৃত্তি কলগুলি নিষিদ্ধ করে এবং পুনরাবৃত্তির জন্য লুপিং স্ট্রাকচারের অভাব রয়েছে এমন ভাষাগুলি রয়েছে।