পুনরাবৃত্তি বোঝার জন্য একটি জটিল বিষয় এবং আমি মনে করি না যে আমি এখানে এটি পুরোপুরি ন্যায়বিচার করতে পারি। পরিবর্তে, আমি এখানে আপনার নির্দিষ্ট কোডের টুকরোটির দিকে মনোনিবেশ করার চেষ্টা করব এবং কেন সমাধানটি কাজ করে এবং কীভাবে কোড তার ফলাফলকে গণনা করে তার যান্ত্রিকতা উভয়ই বর্ণনা করার চেষ্টা করব।
আপনি এখানে যে কোডটি দিয়েছেন তা নিম্নলিখিত সমস্যার সমাধান করে: আপনি একটি থেকে বি, সমেত সমস্ত সংখ্যার যোগফল জানতে চান। আপনার উদাহরণস্বরূপ, আপনি 2 থেকে 5 পর্যন্ত সংখ্যার যোগফল চান, যা অন্তর্ভুক্ত
2 + 3 + 4 + 5
পুনরাবৃত্তিজনকভাবে কোনও সমস্যার সমাধান করার চেষ্টা করার সময়, প্রথম ধাপগুলির একটি হ'ল সমস্যাটি কীভাবে একই কাঠামোর সাথে একটি ছোট সমস্যায় ভেঙে ফেলা যায় তা নির্ধারণ করা উচিত। সুতরাং ধরুন যে আপনি 2 থেকে 5 পর্যন্ত সংখ্যার যোগ করতে চেয়েছিলেন। এটিকে সহজ করার একটি উপায় লক্ষ্য করা যায় যে উপরের যোগফলটি আবার লিখতে পারে
2 + (3 + 4 + 5)
এখানে (3 + 4 + 5) অন্তর্ভুক্ত সহ 3 থেকে 5 এর মধ্যে সমস্ত পূর্ণসংখ্যার যোগফল হয়। অন্য কথায়, আপনি যদি 2 থেকে 5 এর মধ্যে সমস্ত পূর্ণসংখ্যার যোগফল জানতে চান তবে 3 থেকে 5 এর মধ্যে সমস্ত পূর্ণসংখ্যার যোগফলটি গণনা করে শুরু করুন, তারপরে 2 যোগ করুন।
সুতরাং আপনি কীভাবে 3 এবং 5 এর মধ্যে সমস্ত সংখ্যার যোগফলকে গণনা করবেন? ভাল, যে যোগফল
3 + 4 + 5
পরিবর্তে হিসাবে চিন্তা করা যেতে পারে যা
3 + (4 + 5)
এখানে (4 + 5) হ'ল 4 এবং 5 এর মধ্যে সমস্ত সংখ্যার যোগফল। সুতরাং, যদি আপনি 3 এবং 5 এর মধ্যে সমস্ত সংখ্যার যোগফলকে গণনা করতে চান তবে আপনি 4 এবং 5 এর মধ্যে সমস্ত সংখ্যার যোগফল গণনা করতে চান তবে 3 যুক্ত করুন add
এখানে একটি প্যাটার্ন আছে! আপনি যদি একটি এবং খ এর মধ্যে পূর্ণসংখ্যার যোগফলকে গণনা করতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন। প্রথমে সমষ্টি সহ একটি + 1 এবং খ এর মধ্যে পূর্ণসংখ্যার যোগফল গণনা করুন। এর পরে, মোটটিতে একটি যুক্ত করুন। আপনি লক্ষ্য করবেন যে "একটি + 1 এবং বি এর মধ্যে পূর্ণসংখ্যার যোগফল গণনা করা" এর আগে একইরকম সমস্যা হ'ল আমরা ইতিমধ্যে সমাধান করার চেষ্টা করছি তবে কিছুটা আলাদা পরামিতি দিয়ে। একটি থেকে বি, অন্তর্ভুক্তীকরণের পরিবর্তে, আমরা একটি + 1 থেকে বি, সমেত গণনা করছি। এটি পুনরাবৃত্তিমূলক পদক্ষেপ - বৃহত্তর সমস্যা সমাধানের জন্য ("একটি থেকে বি, সমেত" যোগফল), আমরা সমস্যাটিকে নিজের একটি ছোট সংস্করণে হ্রাস করি ("সমষ্টি 1 + 1 থেকে বি, সমেত"।)।
আপনি যদি উপরে বর্ণিত কোডটি একবার দেখে থাকেন তবে লক্ষ্য করবেন যে এতে এই পদক্ষেপ রয়েছে:
return a + sumInts(a + 1, b: b)
এই কোডটি কেবল উপরের যুক্তির একটি অনুবাদ - আপনি যদি একটি থেকে বি, সমেত, যোগ করে + 1 থেকে বি, সমেত (তবে এটির পুনরাবৃত্তি কল sumInt
) এর যোগফল দিয়ে শুরু করতে চান তবে যুক্ত করুন a
।
অবশ্যই, নিজে থেকে এই পদ্ধতির আসলে কাজ করবে না। উদাহরণস্বরূপ, আপনি কীভাবে 5 থেকে 5 এর মধ্যে সমস্ত পূর্ণসংখ্যার যোগফল গণনা করবেন? ঠিক আছে, আমাদের বর্তমান যুক্তি ব্যবহার করে আপনি 6 এবং 5 এর মধ্যে সমস্ত পূর্ণসংখ্যার যোগফল গণনা করতে পারবেন, তারপর 5 যোগ করুন So সুতরাং আপনি কীভাবে 6 এবং 5 এর মধ্যে সমস্ত সংখ্যার যোগফলকে গণনা করবেন? ঠিক আছে, আমাদের বর্তমান যুক্তি ব্যবহার করে আপনি 7 এবং 5 এর মধ্যে সমস্ত পূর্ণসংখ্যার যোগফলকে অন্তর্ভুক্ত করে 6 যুক্ত করতে চান You আপনি এখানে একটি সমস্যা লক্ষ্য করবেন - এটি কেবল চলছে এবং চলছে!
পুনরাবৃত্ত সমস্যা সমাধানের ক্ষেত্রে, সমস্যাটি সহজ করে তোলা বন্ধ করার কিছু উপায় থাকা দরকার এবং এর পরিবর্তে সরাসরি এটি সমাধান করুন। সাধারণত, আপনি এমন একটি সহজ কেস খুঁজে পেয়েছেন যেখানে উত্তরটি তাত্ক্ষণিকভাবে নির্ধারণ করা যেতে পারে, তারপরে যখন সহজ সমাধান হয় তখন সরাসরি সমাধান করার জন্য আপনার সমাধানটি গঠন করুন। একে সাধারণত বেস কেস বা পুনরাবৃত্তির ভিত্তিতে বলা হয় ।
সুতরাং এই বিশেষ সমস্যা বেস কেস কি? আপনি যখন একটি থেকে বি, সমপরিমাণ পূর্ণসংখ্যার যোগফল যোগ করছেন, তখন যদি কোনও খ এর চেয়ে বড় হতে থাকে, তবে উত্তরটি 0 হয় - সীমাতে কোনও সংখ্যা নেই! অতএব, আমরা নিম্নলিখিত হিসাবে আমাদের সমাধান গঠন করব:
- যদি a> খ হয় তবে উত্তরটি 0 হবে।
- অন্যথায় (a ≤ b), উত্তরটি নিম্নরূপ পান:
- একটি + 1 এবং খ এর মধ্যে পূর্ণসংখ্যার যোগফল গণনা করুন।
- উত্তর পেতে একটি যুক্ত করুন।
এখন, এই সিডোকোডটিকে আপনার আসল কোডের সাথে তুলনা করুন:
func sumInts(a: Int, b: Int) -> Int {
if (a > b) {
return 0
} else {
return a + sumInts(a + 1, b: b)
}
}
লক্ষ করুন যে সিউডোকোডে বর্ণিত সমাধান এবং এই আসল কোডের মধ্যে প্রায় এক-এক-এক মানচিত্র রয়েছে। প্রথম পদক্ষেপটি বেস কেস - আপনি খালি পরিসরের সংখ্যার যোগফলের জন্য জিজ্ঞাসা করলে, আপনি 0 পাবেন। অন্যথায়, যোগফলটিকে + 1 এবং খ এর মধ্যে গণনা করুন, তারপরে একটি যুক্ত করুন।
এখনও অবধি, আমি কোডের পিছনে মাত্র একটি উচ্চ-স্তরের ধারণা দিয়েছি। তবে আপনার দুটি আরও ভাল প্রশ্ন ছিল। প্রথমত, ফাংশনটি a> খ হলে 0 ফেরত দিতে বলে কেন এই সর্বদা 0 হয় না? দ্বিতীয়ত, 14 আসলে কোথা থেকে আসে? ঘুরে ফিরে এগুলি দেখুন।
আসুন একটি খুব, খুব সহজ কেস চেষ্টা করুন। ফোন করলে কী হয় sumInts(6, 5)
? এই ক্ষেত্রে, কোডটির সাহায্যে ট্রেসিং করে আপনি দেখতে পাবেন যে ফাংশনটি কেবল ০. ফিরে আসে That's এটি করার জন্য সঠিক জিনিস, করণীয় - সীমাতে কোনও সংখ্যা নেই। এখন, আরও শক্ত কিছু চেষ্টা করুন। ফোন করলে কি হয় sumInts(5, 5)
? ঠিক আছে, এখানে যা ঘটেছিল:
- আপনি কল
sumInts(5, 5)
। আমরা else
শাখায় পড়ি, যা sum a + যোগফলগুলির (6, 5) এর মান প্রদান করে।
sumInts(5, 5)
কী sumInts(6, 5)
তা নির্ধারণ করার জন্য , আমরা কী করছি তা বিরতি দিয়ে কল করতে হবে sumInts(6, 5)
।
sumInts(6, 5)
ডাকা হয়। এটি if
শাখায় প্রবেশ করে ফিরে আসে 0
। যাইহোক, এই উদাহরণটি sumInts
দ্বারা ডাকা হয়েছিল sumInts(5, 5)
, সুতরাং ফেরতের মানটি sumInts(5, 5)
শীর্ষ-স্তরের কলারের কাছে নয়, আবার যোগাযোগ করা হয়।
sumInts(5, 5)
এখন 5 + sumInts(6, 5)
ফিরে পেতে গণনা করতে পারেন 5
। এরপরে এটি শীর্ষ স্তরের কলারে ফেরত দেয়।
5 এখানে মানটি কীভাবে তৈরি হয়েছিল তা লক্ষ্য করুন। আমরা একটি সক্রিয় কল দিয়ে যাত্রা শুরু করি sumInts
। এটি অন্য পুনরাবৃত্তির কলকে বরখাস্ত করে, এবং সেই কলটির দ্বারা ফিরে আসা মানটি তথ্যটিতে আবার যোগাযোগ করে sumInts(5, 5)
। ততক্ষণে কলটি sumInts(5, 5)
কিছু গণনা করেছিল এবং কলারের কাছে একটি মান ফিরিয়ে দেয়।
আপনি যদি এটি দিয়ে চেষ্টা করে থাকেন তবে sumInts(4, 5)
কি হবে তা এখানে:
sumInts(4, 5)
ফিরে যাওয়ার চেষ্টা করে 4 + sumInts(5, 5)
। এটি করার জন্য, এটি কল করে sumInts(5, 5)
।
sumInts(5, 5)
ফিরে যাওয়ার চেষ্টা করে 5 + sumInts(6, 5)
। এটি করার জন্য, এটি কল করে sumInts(6, 5)
।
sumInts(6, 5)
sumInts(5, 5).</li>
<li>
যোগফলগুলিতে 0 (5, 5) now has a value for
যোগফলগুলি (6, 5) , namely 0. It then returns
5 + 0 = 5` এ ফিরে আসে `
sumInts(4, 5)
এখন sumInts(5, 5)
5 এর মান রয়েছে , এটি 5 আবার আসে 4 + 5 = 9
।
অন্য কথায়, যে মানটি প্রত্যাবর্তিত হয় তা একবারে একটি করে মানগুলি যোগ করে গঠিত হয়, প্রতিটি সময় একটি নির্দিষ্ট পুনরাবৃত্ত কল দ্বারা প্রত্যাবর্তিত প্রতিটি মান গ্রহণ করে sumInts
করে এবং এর বর্তমান মান যুক্ত করে গঠিত হয় a
। যখন পুনরাবৃত্তি নীচে নেমে আসে, গভীরতম কলটি 0 ফিরে আসে However তবে, মানটি অবিলম্বে পুনরাবৃত্ত কল চেইন থেকে প্রস্থান করে না; পরিবর্তে, এটি কেবল মানটিকে তার উপরে একটি পুনরাবৃত্ত কলকে ফিরিয়ে দেয়। এইভাবে, প্রতিটি পুনরাবৃত্তি কল কেবল আরও একটি সংখ্যায় যুক্ত করে এবং এটি চেইনে উচ্চতর আপ দেয়, সামগ্রিক সংক্ষেপণের সাথে সমাপ্ত হয়। অনুশীলন হিসাবে, এটি খুঁজে বের করার চেষ্টা করুন sumInts(2, 5)
, যা আপনি শুরু করতে চেয়েছিলেন।
আশাকরি এটা সাহায্য করবে!