আপনি যদি স্ক্র্যাচ থেকে জেনেরিক কম্পিউটারের ন্যূনতম অপারেশনগুলি তৈরি করেন তবে "আইট্রেশন" বিল্ডিং ব্লক হিসাবে প্রথমে আসে এবং "পুনরাবৃত্তি" এর চেয়ে কম সংস্থানীয় সংস্থান হয়, এরগো দ্রুত হয়।
আমরা ধারণাগুলির একটি শ্রেণিবিন্যাস স্থাপন করব, স্ক্র্যাচ থেকে শুরু করে প্রথমে প্রাথমিক, মূল ধারণাগুলি সংজ্ঞায়িত করব, তারপরে সেগুলি সহ দ্বিতীয় স্তরের ধারণাগুলি তৈরি করব।
প্রথম ধারণা: মেমরি সেল, স্টোরেজ, স্টেট । চূড়ান্ত এবং মধ্যবর্তী ফলাফলের মানগুলি সংরক্ষণ করার জন্য আপনার কিছু স্থানের প্রয়োজন । আসুন ধরে নেওয়া যাক আমাদের কাছে "পূর্ণসংখ্যা" কোষের একটি অসীম অ্যারে রয়েছে, যাকে মেমোরি , এম [0..ইসিমেন্ট] বলা হয়।
নির্দেশাবলী: কিছু করুন - একটি ঘরে রূপান্তর করুন, এর মান পরিবর্তন করুন। পরিবর্তন রাষ্ট্র । প্রতিটি আকর্ষণীয় নির্দেশ একটি রূপান্তর সম্পাদন করে। প্রাথমিক নির্দেশাবলী হ'ল:
ক) মেমরি সেলগুলি সেট এবং সরান
- মেমরিতে একটি মান সঞ্চয় করুন, যেমন: 5 মি [4] স্টোর করুন
- অন্য অবস্থানে একটি মান অনুলিপি করুন: উদা: স্টোর এম [4] মি [8]
খ) যুক্তি এবং পাটিগণিত
- এবং, বা, xor, না
- যোগ, উপ, মুল, ডিভ উদাহরণস্বরূপ মি [7] মি [8] যোগ করুন
একটি এক্সিকিউটিভ এজেন্ট : একটি আধুনিক সিপিইউতে একটি মূল । "এজেন্ট" এমন একটি জিনিস যা নির্দেশাবলী কার্যকর করতে পারে। একটি এজেন্ট এছাড়াও কাগজে অ্যালগরিদম নিম্নলিখিত একজন ব্যক্তির হতে পারে।
পদক্ষেপের ক্রম: নির্দেশাবলীর ক্রম : যেমন: প্রথমে এটি করুন, পরে এটি করুন ইত্যাদি etc. নির্দেশিকাগুলির একটি আবশ্যিক ক্রম। এমনকি একটি লাইন এক্সপ্রেশন হ'ল "নির্দেশাবলীর একটি অপরিহার্য ধারা"। আপনার যদি একটি নির্দিষ্ট "মূল্যায়নের আদেশ" দিয়ে অভিব্যক্তি হয় তবে আপনার পদক্ষেপ রয়েছে । এর অর্থ এটি এমনকি একটি একক রচিত এক্সপ্রেশনটির অন্তর্নিহিত "পদক্ষেপ" রয়েছে এবং এতে অন্তর্নিহিত স্থানীয় পরিবর্তনশীল রয়েছে (আসুন একে "ফলাফল" বলি)। উদাহরণ:
4 + 3 * 2 - 5
(- (+ (* 3 2) 4 ) 5)
(sub (add (mul 3 2) 4 ) 5)
উপরের অভিব্যক্তিটি অন্তর্ভুক্ত "ফলাফল" পরিবর্তনশীল সহ 3 টি পদক্ষেপ বোঝায়।
// pseudocode
1. result = (mul 3 2)
2. result = (add 4 result)
3. result = (sub result 5)
সুতরাং এমনকি ইনফিক্স এক্সপ্রেশনও, যেহেতু আপনার মূল্যায়নের একটি নির্দিষ্ট ক্রম রয়েছে, তাই নির্দেশাবলীর একটি আবশ্যিক ক্রম । অভিব্যক্তিটি একটি নির্দিষ্ট ক্রমে তৈরি করা ক্রিয়াকলাপকে বোঝায় এবং পদক্ষেপ রয়েছে বলে একটি অন্তর্নিহিত "ফলাফল" অন্তর্বর্তী ভেরিয়েবলও রয়েছে।
নির্দেশ পয়েন্টার : আপনার যদি পদক্ষেপগুলির ক্রম থাকে তবে আপনার একটি অন্তর্নিহিত "নির্দেশিকা নির্দেশক "ও রয়েছে। নির্দেশিকা নির্দেশক পরবর্তী নির্দেশকে চিহ্নিত করে এবং নির্দেশটি পড়ার পরে কিন্তু নির্দেশ কার্যকর করার আগে অগ্রসর হয়।
এই সিউডো-কম্পিউটিং-মেশিনে, নির্দেশ পয়েন্টারটি মেমোরির অংশ । (দ্রষ্টব্য: সাধারণত নির্দেশ পয়েন্টারটি একটি সিপিইউ কোরের একটি "বিশেষ রেজিস্ট্রার" হবে, তবে এখানে আমরা ধারণাগুলি সহজ করব এবং সমস্ত ডেটা (নিবন্ধভুক্ত অন্তর্ভুক্ত) "মেমোরি" এর অংশ বলে ধরে নেব)
ঝাঁপ দাও - একবার আপনার নির্দেশিত সংখ্যক পদক্ষেপ এবং নির্দেশ পয়েন্টার হয়ে গেলে আপনি নির্দেশ পয়েন্টারের নিজেই মান পরিবর্তন করতে " স্টোর " নির্দেশিকাটি প্রয়োগ করতে পারেন । আমরা স্টোর নির্দেশের এই নির্দিষ্ট ব্যবহারটিকে একটি নতুন নাম দিয়ে ডাকব : ঝাঁপ দাও । আমরা একটি নতুন নাম ব্যবহার করি কারণ এটি একটি নতুন ধারণা হিসাবে ভাবা সহজ। নির্দেশিকা নির্দেশকটি পরিবর্তন করে আমরা এজেন্টকে "ধাপে x এ যেতে" নির্দেশ দিচ্ছি।
অসীম স্বরলিপি : পিছনে ঝাঁপ দিয়ে এখন আপনি এজেন্টকে কয়েকটি নির্দিষ্ট পদক্ষেপ "পুনরাবৃত্তি" করতে পারেন। এই সময়ে আমরা অসীম Iteration আছে।
1. mov 1000 m[30]
2. sub m[30] 1
3. jmp-to 2 // infinite loop
শর্তসাপেক্ষ - নির্দেশাবলীর শর্তসাপেক্ষ কার্যকর। "শর্তসাপেক্ষ" ধারাটির সাহায্যে আপনি শর্তাধীন বর্তমান অবস্থার উপর ভিত্তি করে একাধিক নির্দেশের একটি কার্যকর করতে পারেন (যা পূর্ববর্তী নির্দেশের সাথে সেট করা যেতে পারে)।
যথাযথ আইট্রেটেশন : এখন শর্তাধীন শর্তাদির সাহায্যে আমরা জাম্প ব্যাকের নির্দেশের অসীম লুপটি এড়াতে পারি । আমাদের কাছে এখন একটি শর্তসাপেক্ষ লুপ এবং তারপরে যথাযথ te
1. mov 1000 m[30]
2. sub m[30] 1
3. (if not-zero) jump 2 // jump only if the previous
// sub instruction did not result in 0
// this loop will be repeated 1000 times
// here we have proper ***iteration***, a conditional loop.
নামকরণ : নির্দিষ্ট মেমোরি অবস্থানের জন্য ডেটা ধরে রাখা বা একটি পদক্ষেপ রাখা নামকে দেওয়া । এটি কেবল একটি "সুবিধার্থে" থাকার জন্য। আমরা মেমরির অবস্থানগুলির জন্য "নামগুলি" সংজ্ঞায়িত করার ক্ষমতা রেখে কোনও নতুন নির্দেশনা যুক্ত করি না। "নামকরণ" এজেন্টের জন্য নির্দেশ নয়, এটি আমাদের কাছে কেবল একটি সুবিধা। নামকরণ কোডকে (এই মুহুর্তে) পড়া সহজ করে ও পরিবর্তন করা সহজ করে।
#define counter m[30] // name a memory location
mov 1000 counter
loop: // name a instruction pointer location
sub counter 1
(if not-zero) jmp-to loop
এক-স্তরের সাবরুটিন : ধরুন আপনার ঘন ঘন সঞ্চালনের জন্য প্রয়োজনীয় কয়েকটি পদক্ষেপ রয়েছে। আপনি পদক্ষেপগুলিকে মেমোরিতে একটি নামী অবস্থানে সংরক্ষণ করতে পারেন এবং তারপরে যখন আপনি তাদের (কল) কার্যকর করতে হবে তখন সেই অবস্থানে যেতে পারেন । ক্রম শেষে আপনি কার্যকর করতে চালিয়ে যাওয়ার জন্য কলিং পয়েন্টে ফিরে যেতে হবে । এই প্রক্রিয়াটির সাহায্যে আপনি মূল নির্দেশাবলী রচনা করে নতুন নির্দেশাবলী (সাবরুটাইনগুলি) তৈরি করছেন ।
বাস্তবায়ন: (কোনও নতুন ধারণার প্রয়োজন নেই)
- একটি পূর্বনির্ধারিত মেমরি অবস্থানে বর্তমান নির্দেশ পয়েন্টার সংরক্ষণ করুন
- সাবরোটিনে ঝাঁপ দাও
- সাবরুটাইন শেষে, আপনি পূর্বনির্ধারিত মেমরি অবস্থান থেকে নির্দেশিকা পয়েন্টারটি পুনরুদ্ধার করে কার্যকর কলটির নিম্নলিখিত নির্দেশে কার্যকরভাবে পিছনে ফিরে যান
নিয়ে সমস্যা এক পর্যায়ের বাস্তবায়ন: আপনি একটি সাবরুটিন থেকে অন্য সাবরুটিন কল করতে পারবেন না। যদি আপনি তা করেন, আপনি ফেরত ঠিকানা (গ্লোবাল ভেরিয়েবল) ওভাররাইট করবেন, যাতে আপনি কল করতে পারবেন না।
সাবউটাইনগুলির আরও ভাল বাস্তবায়ন করতে : আপনার একটি স্ট্যাক দরকার
স্ট্যাক : আপনি একটি "স্ট্যাক" হিসাবে কাজ করার জন্য একটি মেমোরি স্পেস নির্ধারণ করেন, আপনি স্ট্যাকের উপর "ধাক্কা" দিতে পারেন, এবং শেষ "ধাক্কা" মানটিও "পপ" করতে পারেন। একটি স্ট্যাক বাস্তবায়নের জন্য আপনার একটি স্ট্যাক পয়েন্টার (নির্দেশ পয়েন্টারের অনুরূপ) প্রয়োজন হবে যা স্ট্যাকের প্রকৃত "মাথা" নির্দেশ করে। আপনি যখন কোনও মান "চাপ" দেন, তখন স্ট্যাক পয়েন্টারটি হ্রাস পায় এবং আপনি মানটি সঞ্চয় করেন। আপনি যখন "পপ" করেন, আপনি প্রকৃত স্ট্যাক পয়েন্টারটিতে মান পাবেন এবং তারপরে স্ট্যাক পয়েন্টারটি বাড়িয়ে তোলা হবে।
সাবরুটাইনগুলি এখন আমাদের কাছে একটি স্ট্যাক রয়েছে আমরা নেস্টেড কলকে মঞ্জুরি দিয়ে যথাযথ সাবরুটাইনগুলি প্রয়োগ করতে পারি । বাস্তবায়নটি একই রকম, তবে পূর্বনির্ধারিত মেমরি অবস্থানে নির্দেশিকা পয়েন্টারটি সংরক্ষণ করার পরিবর্তে আমরা স্ট্যাকের আইপিটির মান "চাপ" দিই । সাবরুটাইন শেষে, আমরা স্ট্যাক থেকে মানটি কেবল "পপ" করি, মূল কলের পরে কার্যকরভাবে নির্দেশের দিকে ফিরে যাই । এই বাস্তবায়ন, একটি "স্ট্যাক" থাকা অন্য সাব্রোটিন থেকে সাব্রুটিন কল করার অনুমতি দেয়। মূল নির্দেশাবলী বা অন্যান্য সাবরুটাইনগুলি বিল্ডিং ব্লক হিসাবে ব্যবহার করে সাব্রোটাইন হিসাবে নতুন নির্দেশাবলী সংজ্ঞায়িত করার সময় আমরা এই প্রয়োগের মাধ্যমে বিমূর্ততার কয়েকটি স্তর তৈরি করতে পারি।
পুনরাবৃত্তি : যখন সাবরুটিন নিজেকে কল করে তখন কী ঘটে ?. এটিকে "পুনরাবৃত্তি" বলা হয়।
সমস্যা: স্থানীয় মধ্যবর্তী ফলাফলগুলিকে ওভাররাইটিং করা একটি সাববুটিন মেমরিতে সঞ্চয় করতে পারে। যেহেতু আপনি একই পদক্ষেপগুলি কল / পুনঃব্যবহার করছেন, যদি মধ্যবর্তী ফলাফলটি পূর্বনির্ধারিত মেমরি অবস্থানগুলিতে (গ্লোবাল ভেরিয়েবল) সঞ্চিত থাকে তবে সেগুলি নেস্টেড কলগুলিতে ওভাররাইট করা হবে।
সমাধান: পুনরাবৃত্তির অনুমতি দেওয়ার জন্য, সাবরুটাইনগুলি স্থানীয় মধ্যবর্তী ফলাফলগুলি স্ট্যাকের মধ্যে সংরক্ষণ করতে হবে , সুতরাং, প্রতিটি পুনরাবৃত্তির কল (প্রত্যক্ষ বা অপ্রত্যক্ষ) মধ্যবর্তী ফলাফলগুলি বিভিন্ন মেমরির স্থানে সংরক্ষণ করা হয়।
...
অবশেষে, নোট করুন যে আপনার পুনরাবৃত্তি ব্যবহার করার প্রচুর সুযোগ রয়েছে। আপনার সর্বত্র রিকারসিভ ডেটা স্ট্রাকচার রয়েছে , আপনি এখন একটিটির দিকে তাকিয়ে রয়েছেন: আপনি যা পড়ছেন তা সমর্থন করছে এমন ডিওএম এর অংশগুলি একটি আরডিএস, একটি জেএসএন এক্সপ্রেশন একটি আরডিএস, আপনার কম্পিউটারে হায়ারারিকাল ফাইল সিস্টেমটি একটি আরডিএস, অর্থাত: আপনার কাছে একটি রুট ডিরেক্টরি, ফাইল এবং ডিরেক্টরি সম্বলিত ফাইল এবং ডিরেক্টরি সম্বলিত প্রতিটি ডিরেক্টরি, ফাইল এবং ডিরেক্টরিগুলি সম্বলিত ডিরেক্টরিগুলির প্রতিটি ...