আমি ভাবলাম কিছুক্ষণ লুপটি অভ্যন্তরীণভাবে একটি পুনরাবৃত্তি কিনা?
আমি মনে করি এটি কারণ কিছুক্ষণ লুপ একটি ফাংশন হিসাবে দেখা যেতে পারে যা শেষে নিজেকে কল করে। যদি এটি পুনরাবৃত্তি না হয়, তবে পার্থক্য কী?
আমি ভাবলাম কিছুক্ষণ লুপটি অভ্যন্তরীণভাবে একটি পুনরাবৃত্তি কিনা?
আমি মনে করি এটি কারণ কিছুক্ষণ লুপ একটি ফাংশন হিসাবে দেখা যেতে পারে যা শেষে নিজেকে কল করে। যদি এটি পুনরাবৃত্তি না হয়, তবে পার্থক্য কী?
উত্তর:
লুপগুলি পুনরাবৃত্তি নয় । আসলে, তারা বিপরীত প্রক্রিয়াটির প্রধান উদাহরণ : পুনরাবৃত্তি ।
পুনরাবৃত্তির বিষয়টি হ'ল প্রক্রিয়াজাতকরণের একটি উপাদান নিজেকে অন্য একটি উদাহরণ বলে । লুপ নিয়ন্ত্রণ যন্ত্রটি কেবল যেখানে শুরু হয়েছিল সেখানে ফিরে আসে।
কোডের চারপাশে জাম্পিং এবং কোডের অন্য ব্লককে কল করা বিভিন্ন ক্রিয়াকলাপ। উদাহরণস্বরূপ, আপনি যখন লুপটির শুরুতে ঝাঁপ দেন, তখন লুপ নিয়ন্ত্রণ ভেরিয়েবলের জাম্পের আগে তার সমান মূল্য থাকে। তবে আপনি যে রুটিনে রয়েছেন তার অন্য কোনও উদাহরণটি যদি কল করেন তবে নতুন দৃষ্টান্তটিতে তার সমস্ত ভেরিয়েবলের নতুন, সম্পর্কিত নয় অনুলিপি রয়েছে। কার্যকরভাবে, একটি ভেরিয়েবলের প্রসেসিংয়ের প্রথম স্তরের একটি মান এবং অন্য স্তরের নিম্ন স্তরে থাকতে পারে।
এই ক্ষমতাটি অনেক পুনরাবৃত্তির অ্যালগোরিদমগুলি কাজ করার জন্য গুরুত্বপূর্ণ, এবং এ কারণেই আপনি পুনরাবৃত্তির মাধ্যমে পুনরাবৃত্তি অনুকরণ করতে পারবেন না নামক ফ্রেমের স্ট্যাক পরিচালনা না করে যা এই সমস্ত মানকে ট্র্যাক করে।
এক্সটি অভ্যন্তরীণভাবে বলা হচ্ছে ওয়াই কেবল তখনই বোধগম্য হয় যদি আপনি কিছু X (আনুষ্ঠানিক) সিস্টেম পেয়ে থাকেন যা আপনি X এর মধ্যে প্রকাশ করছেন while
। আপনি যদি এটি কোনও রেজিস্টার মেশিনের শর্তে সংজ্ঞায়িত করেন তবে আপনি সম্ভবত তা করবেন না।
উভয় ক্ষেত্রেই লোকেরা আপনাকে বুঝতে পারবে না যদি আপনি কোনও ফাংশনকে পুনরাবৃত্ত বলে থাকেন তবে এতে কিছুক্ষণ লুপ থাকে।
* যদিও সম্ভবত কেবল অপ্রত্যক্ষভাবেই, উদাহরণস্বরূপ যদি আপনি এটি শর্তে সংজ্ঞায়িত করেন fold
।
while
সাধারণত ফাংশনগুলির সম্পত্তি, তাই আমি এই প্রসঙ্গে "পুনরাবৃত্ত" হিসাবে বর্ণনা করার মতো আর কিছু ভাবতে পারি না।
এটি আপনার দৃষ্টিভঙ্গির উপর নির্ভর করে।
আপনি যদি কম্পিউটিবেটি তত্ত্বের দিকে তাকান , তবে পুনরাবৃত্তি এবং পুনরাবৃত্তি সমানভাবে প্রকাশযুক্ত । এর অর্থ হ'ল আপনি এমন একটি ফাংশন লিখতে পারেন যা কোনও কিছুর সাথে তুলনা করে এবং আপনি এটি পুনরাবৃত্তভাবে বা পুনরুক্তি করে যাচ্ছেন তা বিবেচ্য নয়, আপনি উভয় পন্থা বেছে নিতে সক্ষম হবেন। আপনি পুনরাবৃত্তভাবে গণনা করতে পারবেন এমন কিছুই নেই যা আপনি পুনরাবৃত্তি এবং তদ্বিপরীত গণনা করতে পারবেন না (যদিও প্রোগ্রামটির অভ্যন্তরীণ কার্যকরীতা আলাদা হতে পারে)।
অনেক প্রোগ্রামিং ভাষা পুনরাবৃত্তি এবং পুনরাবৃত্তির সাথে একই আচরণ করে না এবং সঙ্গত কারণেই। সাধারণত , পুনরাবৃত্তির অর্থ ভাষা / সংকলক কল স্ট্যাক পরিচালনা করে এবং পুনরাবৃত্তির অর্থ আপনাকে নিজেরাই স্ট্যাক হ্যান্ডলিং করতে হতে পারে।
তবে, ভাষা রয়েছে - বিশেষত ক্রিয়ামূলক ভাষা - যেখানে লুপগুলির মতো (যেমন, যখন) প্রকৃতপক্ষে কেবল পুনরাবৃত্তির জন্য সিনট্যাকটিক চিনি এবং সেইভাবে পর্দার আড়ালে প্রয়োগ করা হয়। এটি প্রায়শই কার্যকরী ভাষাগুলিতে আকাঙ্ক্ষিত হয়, কারণ তাদের সাধারণত অন্যথায় লুপিংয়ের ধারণা থাকে না এবং এটি যুক্ত করার ফলে সামান্য ব্যবহারিক কারণে তাদের ক্যালকুলাস আরও জটিল হয়ে যায়।
সুতরাং না, তারা অভ্যন্তরীণভাবে এক নয় । এইগুলি হল সমানভাবে ভাবপূর্ণ , আপনি Compute কিছু iteratively এই আপনি recursively গনা করতে পারে না এবং ভাইস অর্থ করতে পারবেন বিপরীতভাবে, কিন্তু এটা সম্পর্কে যে, সাধারণ ক্ষেত্রে (চার্চ-টুরিং থিসিস অনুযায়ী)।
নোট করুন যে আমরা এখানে পুনরাবৃত্ত প্রোগ্রামগুলি সম্পর্কে কথা বলছি । পুনরাবৃত্তির অন্যান্য রূপ রয়েছে যেমন, ডেটা স্ট্রাকচারে (যেমন গাছ)।
আপনি যদি বাস্তবায়নের দিক থেকে এটি দেখে থাকেন তবে পুনরাবৃত্তি এবং পুনরাবৃত্তি একরকম নয় পুনরাবৃত্তি প্রতিটি কলের জন্য একটি নতুন স্ট্যাক ফ্রেম তৈরি করে। পুনরাবৃত্তির প্রতিটি পদক্ষেপ স্ব-অন্তর্নিহিত, কলি (নিজে থেকেই) থেকে গণনার পক্ষে যুক্তি পেয়ে থাকে।
অন্যদিকে লুপগুলি কল ফ্রেম তৈরি করে না। তাদের জন্য, প্রতিটি পদক্ষেপে প্রসঙ্গ সংরক্ষণ করা হয় না। লুপটির জন্য, লুপের শর্তটি ব্যর্থ না হওয়া পর্যন্ত প্রোগ্রামটি কেবল লুপের শুরুতে ফিরে আসে।
এটি জেনে রাখা বেশ গুরুত্বপূর্ণ, যেহেতু এটি বাস্তব বিশ্বে বেশ মৌলিক পার্থক্য করতে পারে। পুনরাবৃত্তির জন্য, প্রতিটি কলটিতে পুরো প্রসঙ্গটি সংরক্ষণ করতে হবে। পুনরাবৃত্তির জন্য, কী ভেরিয়েবলগুলি মেমরিতে থাকে এবং কোথায় সেভ হয় সে সম্পর্কে আপনার সুনির্দিষ্ট নিয়ন্ত্রণ রয়েছে।
আপনি যদি সেভাবে এটি দেখতে পান তবে আপনি দ্রুত দেখতে পাবেন যে বেশিরভাগ ভাষার ক্ষেত্রে পুনরাবৃত্তি এবং পুনরাবৃত্তি মূলত পৃথক এবং পৃথক বৈশিষ্ট্য রয়েছে। পরিস্থিতির উপর নির্ভর করে কিছু সম্পত্তি অন্যদের চেয়ে বেশি পছন্দসই।
পুনরাবৃত্তি প্রোগ্রামগুলিকে আরও সহজ এবং পরীক্ষা এবং প্রমাণের পক্ষে সহজ করে তুলতে পারে । পুনরাবৃত্তিকে পুনরাবৃত্তিতে রূপান্তরকরণ কোডটি আরও জটিল করে তোলে, ব্যর্থতার সম্ভাবনা বাড়িয়ে তোলে। অন্যদিকে, পুনরাবৃত্তিতে রূপান্তর করা এবং কল স্ট্যাক ফ্রেমের পরিমাণ হ্রাস করা প্রয়োজনীয় মেমরিটিকে বাঁচাতে পারে।
পার্থক্য হ'ল অন্তর্নিহিত স্ট্যাক এবং শব্দার্থক।
এমন একটি লুপ যা "শেষে নিজেকে কল করে" এর কাজ শেষ হয়ে যাওয়ার পরে ব্যাক আপ করার কোনও স্ট্যাক থাকে না। এটি শেষ পুনরাবৃত্তিটি নির্ধারণ করে যে এটি শেষ হওয়ার সাথে সাথে কী অবস্থা হবে।
পূর্বে করা কাজের অবস্থা মনে রাখে এমন এই অন্তর্নির্মিত স্ট্যাক ব্যতীত পুনরাবৃত্তি করা যাবে না।
এটি সত্য যে আপনি কোনও স্ট্রাকের স্পষ্টভাবে অ্যাক্সেস দিলে পুনরাবৃত্তি সহ যে কোনও পুনরাবৃত্তি সমস্যা সমাধান করতে পারেন। তবে সেভাবে করা এক নয়।
অর্থগত পার্থক্যটি এই সত্যটির সাথে সম্পর্কিত যে পুনরাবৃত্ত কোডের দিকে তাকানো পুনরুক্তি কোডের চেয়ে সম্পূর্ণ ভিন্ন উপায়ে একটি ধারণা দেয়। Iterative কোড জিনিস একবারে একটি পদক্ষেপ করে। এটি পূর্বে থেকে আসা যে কোনও রাষ্ট্রকে গ্রহণ করে এবং কেবলমাত্র পরবর্তী রাষ্ট্র তৈরিতে কাজ করে।
রিকার্সিভ কোড একটি সমস্যাটিকে ফ্র্যাক্টাল হিসাবে বিভক্ত করে। এই ছোট্ট অংশটি বড় অংশটির মতো দেখাচ্ছে যাতে আমরা এটির কিছুটা এবং এটির কিছুটা একইভাবে করতে পারি same সমস্যাগুলি সম্পর্কে চিন্তাভাবনা করার এটি আলাদা উপায়। এটি খুব শক্তিশালী এবং অভ্যস্ত হয়ে ওঠে। কয়েকটি লাইনে অনেক কিছুই বলা যায়। আপনি এটি স্ট্যাকের অ্যাক্সেস পেয়েও লুপ লুপের বাইরে বের করতে পারবেন না।
এটি সমস্ত শব্দটি আপনার অভ্যন্তরীণভাবে ব্যবহারের উপর নির্ভর করে । প্রোগ্রামিং ভাষার স্তরে, এগুলি সিনট্যাক্টিকালি এবং শব্দার্থগতভাবে পৃথক এবং এগুলির কার্যকারিতা এবং মেমরির ব্যবহার বেশ আলাদা different তবে আপনি যদি তত্ত্বের যথেষ্ট গভীর খনন করেন তবে এগুলি একে অপরের দিক দিয়ে সংজ্ঞায়িত করা যেতে পারে এবং তাই কিছু তাত্ত্বিক দিক থেকে এটি "একই"।
আসল প্রশ্নটি হ'ল: পুনরাবৃত্তি (লুপস) এবং পুনরাবৃত্তিগুলির মধ্যে পার্থক্য করা কখনই বোধগম্য হয় এবং এটিকে একই জিনিস হিসাবে ভাবা কখন কার্যকর? উত্তরটি হ'ল আসলে প্রোগ্রামিং করার সময় (গণিতের প্রমাণগুলি লেখার বিপরীতে) পুনরাবৃত্তি এবং পুনরাবৃত্তির মধ্যে পার্থক্য করা গুরুত্বপূর্ণ to
পুনরাবৃত্তি একটি নতুন স্ট্যাক ফ্রেম তৈরি করে, অর্থাৎ প্রতিটি কলের জন্য স্থানীয় ভেরিয়েবলগুলির একটি নতুন সেট। এটির ওভারহেড রয়েছে এবং স্ট্যাকের উপরে স্থান নেয়, যার অর্থ একটি গভীর পর্যাপ্ত পুনরাবৃত্তি স্ট্যাকটিকে উপচে ফেলতে পারে যা প্রোগ্রামটি ক্র্যাশ করে। অন্যদিকে Iteration কেবল বিদ্যমান পরিবর্তনশীলগুলিকে সংশোধন করে তাই সাধারণত দ্রুত হয় এবং কেবলমাত্র একটি ধ্রুব পরিমাণে মেমরি গ্রহণ করে। সুতরাং এটি একটি বিকাশকারীদের জন্য একটি খুব গুরুত্বপূর্ণ পার্থক্য!
টেল-কল পুনরাবৃত্তি (সাধারণত ক্রিয়ামূলক ভাষা) সহ ভাষাগুলিতে, সংকলকটি পুনরাবৃত্ত কলগুলি এমনভাবে অনুকূল করতে সক্ষম হতে পারে যে তারা কেবল স্থির পরিমাণের স্মৃতি গ্রহণ করে। এই ভাষাগুলিতে গুরুত্বপূর্ণ পার্থক্যটি পুনরাবৃত্তি বনাম পুনরাবৃত্তি নয়, তবে অ-লেজু-কল-পুনরাবৃত্তি সংস্করণ লেজু-কল-পুনরাবৃত্তি এবং পুনরাবৃত্তি।
নীচের লাইন: আপনার পার্থক্যটি বলতে সক্ষম হওয়া দরকার, অন্যথায় আপনার প্রোগ্রামটি ক্রাশ হয়ে যাবে।
while
লুপগুলি পুনরাবৃত্তির এক রূপ, দেখুন এই প্রশ্নের স্বীকৃত উত্তর । তারা গণনাযোগ্যতার তত্ত্বের operator-অপারেটরের সাথে মিল রাখে (যেমন এখানে দেখুন )।
for
লুপগুলির সমস্ত প্রকারভেদ যা সংখ্যার একটি পরিসীমা, একটি সীমাবদ্ধ সংগ্রহ, একটি অ্যারে ইত্যাদির উপর পুনরাবৃত্তি করে, আদিম পুনরাবৃত্তির সাথে সঙ্গতিপূর্ণ, যেমন এখানে এবং এখানে দেখুন । নোট করুন যে for
সি, সি ++, জাভা এবং আরও অনেকগুলি লুপগুলি আসলে একটি while
লুপের জন্য সিনট্যাকটিক চিনি এবং তাই এটি আদিম পুনরাবৃত্তির সাথে সামঞ্জস্য করে না। পাস্কাল for
লুপ আদিম পুনরাবৃত্তির একটি উদাহরণ।
একটি গুরুত্বপূর্ণ পার্থক্য হ'ল আদিম পুনরাবৃত্তি সর্বদা শেষ হয়, যেখানে সাধারণীকরণ পুনরাবৃত্তি ( while
লুপস) সমাপ্ত হতে পারে না।
সম্পাদনা
মন্তব্য এবং অন্যান্য উত্তর সম্পর্কিত কিছু স্পষ্টতা ations "কোনও জিনিস যখন নিজের বা তার ধরণের ক্ষেত্রে সংজ্ঞায়িত করা হয় তখন পুনরাবৃত্তি ঘটে।" ( উইকিপিডিয়া দেখুন ) সুতরাং,
লুপটি কি অভ্যন্তরীণভাবে একটি পুনরাবৃত্তি হয়?
যেহেতু আপনি while
নিজের দিক থেকে একটি লুপ সংজ্ঞায়িত করতে পারেন
while p do c := if p then (c; while p do c))
তারপরে, হ্যাঁ , একটি while
লুপ পুনরাবৃত্তির একটি রূপ। রিকার্সিভ ফাংশন হ'ল পুনরাবৃত্তির আরেকটি রূপ (পুনরাবৃত্ত সংজ্ঞাটির অন্য উদাহরণ)। তালিকা এবং গাছগুলি পুনরাবৃত্তির অন্যান্য রূপ।
আরও একটি প্রশ্ন যা প্রত্যক্ষভাবে অনেক উত্তর এবং মন্তব্য দ্বারা অনুমিত হয়
লুপ এবং পুনরাবৃত্ত ফাংশন সমান যখন হয়?
এই প্রশ্নের উত্তর হ'ল না : একটি while
লুপ একটি লেজ-পুনরাবৃত্ত ফাংশনের সাথে সম্পর্কিত, যেখানে লুপ দ্বারা অ্যাক্সেস করা ভেরিয়েবলগুলি অন্তর্নিহিত পুনরাবৃত্ত ফাংশনের যুক্তির সাথে মিল রাখে, তবে অন্যরা যেমন উল্লেখ করেছেন, অ-পুচ্ছ-পুনরাবৃত্তি ফাংশনগুলি while
অতিরিক্ত স্ট্যাক ব্যবহার না করে একটি লুপ দ্বারা মডেল করা যায় না ।
সুতরাং, "একটি while
লুপটি পুনরাবৃত্তির এক রূপ" এই সত্যটির সাথে বিরোধী নয় যে "কিছু পুনরাবৃত্তি ফাংশন একটি while
লুপ দ্বারা প্রকাশ করা যায় না "।
FOR
লুপের সাথে একটি ভাষা ঠিক সমস্ত আদিম পুনরাবৃত্ত ফাংশনগুলি গণনা করতে পারে, এবং কেবল একটি WHILE
লুপের সাথে একটি ভাষা হ'ল সমস্ত rec-পুনরাবৃত্ত ফাংশনগুলি গণনা করতে পারে (এবং এটি দেখা যায় যে rec-রিকার্স ফাংশনগুলি হ'ল সেই ফাংশনগুলি যা একটি ট্যুরিং মেশিন গণনা করতে পারে)। বা, এটি সংক্ষিপ্ত করার জন্য: আদিম পুনরাবৃত্তি এবং µ-পুনরাবৃত্তি হ'ল গণিত / গণনা তত্ত্বের প্রযুক্তিগত পদ।
একটি লেজ কল (বা লেজ পুনরাবৃত্তির কল) হুবহু "আর্গুমেন্টের সাথে গোটো" হিসাবে প্রয়োগ করা হয় ( কল স্ট্যাকের উপরে কোনও অতিরিক্ত কল ফ্রেমকে চাপ না দিয়ে ) এবং কিছু কার্যকরী ভাষায় (ওকামল উল্লেখযোগ্যভাবে) লুপিংয়ের স্বাভাবিক উপায়।
সুতরাং কিছুক্ষণের জন্য লুপটি (সেগুলিতে থাকা ভাষাগুলিতে) এর শরীরে লেজ ডাকার (বা এর মাথা পরীক্ষা) সমাপ্তি হিসাবে দেখা যেতে পারে।
তেমনি, সাধারণ (নন টেল-কল) রিকার্সিভ কলগুলি লুপগুলি (কিছু স্ট্যাক ব্যবহার করে) সিমুলেট করা যায়।
ধারাবাহিকতা এবং ধারাবাহিকতা-পাসিং শৈলী সম্পর্কেও পড়ুন ।
সুতরাং "পুনরাবৃত্তি" এবং "পুনরাবৃত্তি" গভীর সমতুল্য।
এটি সত্য যে উভয় পুনরাবৃত্তি এবং আনবাউন্ডেড যখন লুপগুলি গণনামূলক এক্সপ্রেশনেশনের ক্ষেত্রে সমান। অর্থাৎ, পুনরাবৃত্তির সাথে লিখিত যে কোনও প্রোগ্রামের পরিবর্তে লুপগুলি ব্যবহার করে এবং তদ্বিপরীতভাবে একটি সমতুল্য প্রোগ্রামে আবারও লেখা যেতে পারে। উভয় পন্থা টিউরিং-সম্পূর্ণ , এটি হয় কোনও গণনীয় ফাংশন গণনা করতে ব্যবহার করা যেতে পারে।
প্রোগ্রামিংয়ের ক্ষেত্রে মৌলিক পার্থক্য হ'ল পুনরাবৃত্তি আপনাকে ডেটা ব্যবহার করতে দেয় যা কল স্ট্যাকে সঞ্চিত হয়। এটি চিত্রিত করার জন্য, ধরে নিন যে আপনি একটি লুপ বা পুনরাবৃত্তি ব্যবহার করে একক সংযুক্ত তালিকার একটি উপাদান মুদ্রণ করতে চান। আমি উদাহরণ কোডের জন্য সি ব্যবহার করব:
typedef struct List List;
struct List
{
List* next;
int element;
};
void print_list_loop(List* l)
{
List* it = l;
while(it != NULL)
{
printf("Element: %d\n", it->element);
it = it->next;
}
}
void print_list_rec(List* l)
{
if(l == NULL) return;
printf("Element: %d\n", l->element);
print_list_rec(l->next);
}
সরল, তাই না? এবার আসুন একটি সামান্য পরিবর্তন করুন: বিপরীত ক্রমে তালিকাটি মুদ্রণ করুন।
পুনরাবৃত্তির বৈকল্পিকের জন্য, এটি মূল ফাংশনে প্রায় তুচ্ছ পরিবর্তন:
void print_list_reverse_rec(List* l)
{
if (l == NULL) return;
print_list_reverse_rec(l->next);
printf("Element: %d\n", l->element);
}
লুপ ফাংশনের জন্য যদিও আমাদের একটি সমস্যা আছে। আমাদের তালিকাটি এককভাবে সংযুক্ত এবং এইভাবে কেবল এগিয়ে যেতে পারে ed তবে যেহেতু আমরা বিপরীতে মুদ্রণ করছি, আমাদের শেষ উপাদানটি মুদ্রণ করতে হবে। একবার আমরা শেষ উপাদানটিতে পৌঁছে গেলে আমরা আর দ্বিতীয় থেকে শেষ উপাদানটিতে ফিরে যেতে পারি না।
সুতরাং আমাদের হয় পুরোপুরি পুনরায় ট্রান্সভারিং করতে হবে, বা আমাদের একটি সহায়ক তথ্য কাঠামো তৈরি করতে হবে যা পরিদর্শনকারী উপাদানগুলির উপর নজর রাখে এবং যেখান থেকে আমরা দক্ষতার সাথে মুদ্রণ করতে পারি।
পুনরাবৃত্তি নিয়ে কেন আমাদের এই সমস্যা নেই? কারণ পুনরাবৃত্তিতে ইতিমধ্যে আমাদের কাছে একটি সহায়ক ডেটা কাঠামো রয়েছে: ফাংশন কল স্ট্যাক।
যেহেতু পুনরাবৃত্তি আমাদের পুনরাবৃত্ত কলটির পূর্ববর্তী অনুরোধে ফিরে আসতে দেয়, সমস্ত স্থানীয় ভেরিয়েবল এবং সেই কলটির জন্য স্টেটটি এখনও অক্ষত থাকে, তাই আমরা কিছুটা নমনীয়তা অর্জন করি যা পুনরাবৃত্তির ক্ষেত্রে মডেল করার জন্য ক্লান্তিকর হবে।
একটি নির্দিষ্ট টাস্ক (বেশিরভাগ পুনরাবৃত্তি) অর্জনের জন্য লুপগুলি পুনরাবৃত্তির একটি বিশেষ ফর্ম। একাধিক ভাষায় একই পারফরম্যান্সের সাথে একজন পুনরাবৃত্ত শৈলীতে একটি লুপ প্রয়োগ করতে পারে [1]। এবং এসআইসিপি [2] এ আপনি দেখতে পারবেন যে লুপগুলিকে "সিনটাস্টিক চিনি" হিসাবে বর্ণনা করা হয়েছে। বেশিরভাগ অপরিহার্য প্রোগ্রামিং ভাষায়, যখন এবং ব্লকগুলি তাদের পিতামাতার কাজ হিসাবে একই সুযোগ ব্যবহার করে। তবুও, বেশিরভাগ কার্যকরী প্রোগ্রামিং ভাষায় লুপগুলি উপস্থিত থাকে না বা হয় না কারণ লুপগুলির কোনও প্রয়োজন হয় না।
লুপগুলির জন্য / অপরিহার্য ভাষাগুলির কারণ হ'ল তারা রাজ্যগুলিকে পরিবর্তিত করে পরিচালনা করছে। তবে প্রকৃতপক্ষে, যদি আপনি ভিন্ন দৃষ্টিকোণ থেকে দেখে থাকেন, আপনি যদি নিজেকে একটি ফাংশন হিসাবে কিছুক্ষণ অবরুদ্ধ বলে মনে করেন, প্যারামিটার গ্রহণ করে, এটি প্রক্রিয়া করে এবং একটি নতুন রাষ্ট্র ফিরিয়ে দেন - যা একই সাথে বিভিন্ন পরামিতিগুলির সাথে একই ফাংশনের কল হতে পারে - আপনি লুপটিকে পুনরাবৃত্তি হিসাবে ভাবতে পারে।
বিশ্বের পরিবর্তনীয় বা পরিবর্তনীয় হিসাবে সংজ্ঞায়িত করা যেতে পারে। যদি আমরা বিশ্বকে নিয়মের একটি সেট হিসাবে সংজ্ঞায়িত করি এবং চূড়ান্ত ফাংশনকে কল করি যা সমস্ত নিয়ম, এবং বর্তমান অবস্থাটিকে পরামিতি হিসাবে গ্রহণ করে এবং একই কার্যকারিতা সহ এই পরামিতিগুলির সাথে নতুন রাষ্ট্রটি ফিরিয়ে দেয় (একইভাবে পরবর্তী রাষ্ট্র তৈরি করে) উপায়), আমরা পাশাপাশি বলতে পারি যে এটি একটি পুনরাবৃত্তি এবং একটি লুপ।
নিম্নলিখিত উদাহরণে, জীবনটি হল ফাংশনটি "নিয়ম" এবং "রাষ্ট্র" দুটি পরামিতি নেয় এবং পরের বারের টিকের মধ্যে নতুন রাষ্ট্র নির্মিত হবে।
life rules state = life rules new_state
where new_state = construct_state_in_time rules state
[1]: একটি নতুন তৈরির পরিবর্তে পুনরাবৃত্ত কলগুলিতে বিদ্যমান ফাংশন স্ট্যাকটি ব্যবহার করতে ফাংশনাল প্রোগ্রামিং ভাষাগুলিতে টেল কল অপ্টিমাইজেশন একটি সাধারণ অপ্টিমাইজেশন।
[2]: কম্পিউটার প্রোগ্রামগুলির গঠন এবং ব্যাখ্যা, এমআইটি। https://mitpress.mit.edu/books/structure-and-interpretation-computer-programs
লুপটি পুনরাবৃত্তির চেয়ে আলাদা।
যখন একটি ফাংশন বলা হয়, নিম্নলিখিত স্থান নেয়:
স্ট্যাকের সাথে একটি স্ট্যাক ফ্রেম যুক্ত করা হয়েছে।
কোড পয়েন্টারটি ফাংশনের শুরুতে চলে যায়।
যখন লুপটি শেষে থাকে তখন নিম্নলিখিতটি ঘটে:
একটি শর্ত জিজ্ঞাসা করে কিছু সত্য কিনা।
যদি তা হয়, কোডটি একটি বিন্দুতে লাফ দেয়।
সাধারণভাবে, সময় লুপটি নিম্নলিখিত সিউডোকোডের অনুরূপ:
if (x)
{
Jump_to(y);
}
সর্বাধিক গুরুত্বপূর্ণ, পুনরাবৃত্তি এবং লুপগুলির বিভিন্ন সমাবেশ কোড উপস্থাপনা এবং মেশিন কোডের উপস্থাপনা রয়েছে। এর অর্থ তারা এক নয়। তাদের একই ফলাফল থাকতে পারে, তবে বিভিন্ন মেশিন কোড প্রমাণ করে যে তারা 100% একই জিনিস নয়।
কেবল পুনরাবৃত্তি সাধারণত পুনরাবৃত্তির সমতুল্য হতে অপর্যাপ্ত, তবে স্ট্যাকের সাথে পুনরাবৃত্তি সাধারণত সমতুল্য। কোনও পুনরাবৃত্ত ফাংশন একটি স্ট্যাক সহ একটি পুনরাবৃত্তি লুপ হিসাবে পুনরায় প্রোগ্রাম করা যেতে পারে, এবং তদ্বিপরীত। এর অর্থ এই নয় যে এটি ব্যবহারিক, তবে কোনও নির্দিষ্ট পরিস্থিতিতে অন্য সংস্করণে এক বা অন্য রূপের সুস্পষ্ট সুবিধা থাকতে পারে।
আমি নিশ্চিত নই কেন এটি বিতর্কিত। স্ট্যাক সহ পুনরাবৃত্তি এবং পুনরাবৃত্তি একই গণনা প্রক্রিয়া। তারা একই "ঘটনা", তাই কথা বলতে।
কেবলমাত্র আমি ভাবতে পারি তা হ'ল এগুলিকে "প্রোগ্রামিং সরঞ্জাম" হিসাবে দেখলে আমি সম্মত হব যে আপনি এগুলি একই জিনিস হিসাবে ভাবেন না। এগুলি "গাণিতিক" বা "গণনাগত" সমতুল্য (আবার স্ট্যাকের সাথে পুনরাবৃত্তি, সাধারণভাবে পুনরাবৃত্তি নয়), তবে এর অর্থ এই নয় যে আপনি যে কোনও একটি করবে সে চিন্তায় সমস্যার সমাধান করা উচিত। একটি বাস্তবায়ন / সমস্যা সমাধানের দৃষ্টিকোণ থেকে, কিছু সমস্যা এক বা অন্য উপায়ে আরও ভালভাবে কাজ করতে পারে এবং প্রোগ্রামার হিসাবে আপনার কাজটি কোনটি আরও উপযুক্ত তার জন্য সঠিকভাবে সিদ্ধান্ত নেওয়া।
স্পষ্ট করার জন্য, প্রশ্নের উত্তরটি কী লুপটি স্বতন্ত্রভাবে পুনরাবৃত্তি হয়? এটি একটি নির্দিষ্ট নম্বর , বা কমপক্ষে "যদি আপনার পাশাপাশি স্ট্যাক না থাকে তবে" নয়।