পুনরাবৃত্তির কাজগুলি কীভাবে কাজ করে তা বোঝা


115

শিরোনামটি ব্যাখ্যা করার সাথে সাথে আমার কাছে একটি খুব মৌলিক প্রোগ্রামিং প্রশ্ন রয়েছে যা আমি এখনও খাঁজতে পারি নি। সমস্ত (অত্যন্ত চতুর) ফিল্টারিং করা "পুনরাবৃত্তি বুঝতে হলে আপনাকে অবশ্যই প্রথমে পুনরাবৃত্তি বুঝতে হবে।" বিভিন্ন অনলাইন থ্রেডের জবাব আমি এখনও এটি যথেষ্টভাবে পাচ্ছি না।

আমরা যা জানি না, তা না জানার মুখোমুখি হয়ে আমরা ভুল প্রশ্ন জিজ্ঞাসা করতে পারি বা সঠিক প্রশ্নগুলি ভুলভাবে জিজ্ঞাসা করতে পারি আমি যে প্রশ্নটি "মনে করি" তা ভাগ করে নেব আশা করি যে অনুরূপ দৃষ্টিভঙ্গি সহ কেউ কিছু ভাগ করতে পারে কিছুটা জ্ঞান যা আমার জন্য পুনরাবৃত্ত আলোর বাল্ব চালু করতে সহায়তা করবে!

এখানে ফাংশনটি রয়েছে (সিনট্যাক্সটি সুইফটে লেখা হয়):

func sumInts(a: Int, b: Int) -> Int {
    if (a > b) {
        return 0
    } else {
        return a + sumInts(a: a + 1, b: b)
    }
}

আমরা আমাদের আর্গুমেন্ট হিসাবে 2 এবং 5 ব্যবহার করব:

println(sumInts(a: 2, b: 5))

অবশ্যই উত্তরটি 14. তবে কীভাবে সেই মানটি অর্জন করা যায় সে সম্পর্কে আমি পরিষ্কার নই।

এগুলি আমার 2 টি হ্যাঙ্গআপস:

  1. কোনও শর্ত পূরণ না হওয়া পর্যন্ত ফাংশনটিকে পুনরাবৃত্তভাবে বলা হয়। শর্তটি a> খ। যখন এই শর্তটি পূরণ হয়, ফিরে যান ০. প্রথম নজরে, আমি প্রত্যাবর্তন মান 0 হওয়ার প্রত্যাশা করব যা স্পষ্টতই ভুল।

  2. প্রতিটি পুনরাবৃত্তির উপর 'ক' এর মান মুদ্রণের ফলে আমি প্রত্যাশা করব এমন একটি ফল পাওয়া যায়: 2, 3, 4, 5 (যে বিন্দুতে 5 + 1> বি প্রথম শর্তটি পূরণ করে: ক> খ) তবে আমি এখনও ডন করি না ' টি দেখুন কীভাবে 14 এর মান অর্জন করা হয়।

আমার প্রথম ধারণাটি হ'ল নীচের মতো কিছু ঘটনাক্রমে ঘটছে:

var answer = a;
answer += a+1 until a > b;
return answer;   

তাই ম্যাজিককে উড়িয়ে দিচ্ছি, আমি কিছু পাচ্ছি না। আমি কেবল স্পষ্টতই আরও বেশি কিছু বুঝতে চাইছি।

যদি কেউ দয়া করে ব্যাখ্যা করতে পারে যে প্রযুক্তিগতভাবে এই জাতীয় ফাংশনের সময় কী ঘটে থাকে এবং কেন ফলাফল 0 হয় না এবং শেষ পর্যন্ত কীভাবে হয় a + sumInts(a: a + 1, b: b) = 14, আমি আপনার foreverণে চিরকাল থাকব।


7
সংস্করণ হ'ল সেই প্রোগ্রামিং কনসেপ্টগুলির মধ্যে একটি যা কোডের চেয়ে গাণিতিক শর্তে বোঝা অনেক সহজ; এখানে একটি ভাল সংজ্ঞা রয়েছে
blgt

5
LearnYouARecursion, বিশ্বমানের অধ্যাপকের কাছ থেকে সম্পূর্ণ সমস্যা সেট!
recursion.ninja

15
আমি শুধু আছে গুগল সার্চ বাক্সে "Recursion" টাইপ করতে আপনি তাড়ন করে। সেই ইস্টার ডিমগুলির মধ্যে একটি। আমি আপনার জন্য বিস্ময় নষ্ট করব না।
ফ্লোরিস


উত্তর:


107

আমি মনে করি যে এই বিভ্রান্তিটিকে "একই ফাংশন" হিসাবে ডাকা হচ্ছে বলে অনেকবার বলা হয়েছে। যদি আপনি এটিকে "একই ফাংশনের অনেকগুলি অনুলিপি বলা হচ্ছে" হিসাবে মনে করেন, তবে এটি আরও পরিষ্কার হতে পারে:

ফাংশনের কেবলমাত্র একটি অনুলিপি 0 প্রদান করে এবং এটি প্রথমটি নয় (এটি সর্বশেষটি)। সুতরাং প্রথমটি কল করার ফলাফলটি 0 নয়।

দ্বিতীয় বিভ্রান্তির জন্য, আমি মনে করি ইংরেজিতে পুনরাবৃত্তিটি উচ্চারণ করা আরও সহজ হবে। এই লাইনটি পড়ুন:

return a + sumInts(a + 1, b: b)

"'এ' প্লাসের মান ফিরিয়ে দিন (ফাংশনের অন্য অনুলিপিটির রিটার্ন মান, যা 'ক' প্লাসের অনুলিপি (ফাংশনের অন্য অনুলিপিটির রিটার্ন মান, যা 'দ্বিতীয় অনুলির মান' এ 'বি শর্ত পূরণ না হওয়া অবধি ফাংশনের প্রতিটি অনুলিপি নিজেই একটি নতুন অনুলিপি তৈরি করে, যার সাথে অ> বি শর্ত পূরণ হয় না।

আপনি যখন> এ শর্তটি সত্য বলে পৌঁছাবেন ততক্ষণে আপনার চলার মাঝামাঝি সময়ে ফাংশনের অনুলিপিগুলির একটি (সম্ভাব্য যথেচ্ছভাবে) দীর্ঘ স্ট্যাক রয়েছে, তারা পরবর্তী কপির ফলাফলের জন্য অপেক্ষা করছেন তারা কী তা জানার জন্য 'এ' যুক্ত করা উচিত।

(সম্পাদনা: এছাড়াও, সচেতন হওয়ার মতো কিছু হ'ল আমি উল্লেখ করি ফাংশনটির অনুলিপিগুলি একটি আসল জিনিস যা আসল স্মৃতি গ্রহণ করে এবং এটি খুব বড় হয়ে গেলে আপনার প্রোগ্রামটি ক্র্যাশ করে। কেস, তবে ক্লান্তিকর স্ট্যাক স্পেস অনেক ভাষায় পুনরাবৃত্ত ফাংশনগুলির একটি গুরুত্বপূর্ণ এবং দুর্ভাগ্যজনক সীমাবদ্ধতা)


7
ক্যাটফিশ_মান: আমার মনে হয় আপনি এটি পেরেক দিয়েছেন! এটি একই ফাংশনের বেশ কয়েকটি "অনুলিপি" হিসাবে ভাবা মোটেও বুদ্ধিমান। আমি এখনও আমার মাথাটি এটির চারপাশে আবৃত করছি তবে আমি মনে করি আপনি আমাকে সঠিক পথে ফেলে দিয়েছেন! সহকর্মী প্রোগ্রামারকে সাহায্য করার জন্য আপনার ব্যস্ততার জন্য সময় বের করার জন্য ধন্যবাদ! আমি আপনার উত্তরটিকে সঠিক উত্তর হিসাবে চিহ্নিত করব। দিন শুভ হোক!
জেসন এলউড

13
এটি একটি ভাল উপমা - যদিও প্রতিটি "অনুলিপি" আসলে হুবহু সঠিক কোড হিসাবে এটি খুব আক্ষরিকভাবে না নেওয়ার বিষয়ে সতর্ক হন। প্রতিটি অনুলিপিটির জন্য যা আলাদা তা হ'ল এটিতে কাজ করা সমস্ত ডেটা।
টিম বি

2
আমি এটিকে অনুলিপি হিসাবে ভেবে খুব খুশি নই। আমি দেখতে পেলাম যে আরও একটি স্বজ্ঞাত ব্যাখ্যাটি হ'ল ফাংশনটি (কোড, এটি কী করে) এবং একটি ফাংশন প্রার্থনা (সেই ফাংশনটির ইনস্ট্যান্টেশন) যাতে স্ট্যাক ফ্রেম / সম্পাদন প্রসঙ্গে যুক্ত হয় differen ফাংশনটির স্থানীয় ভেরিয়েবলগুলির মালিকানা নেই, ফাংশনটি বলা হয় (আহবান করা হয়) এগুলি তত্ক্ষণাত্‍ করে দেওয়া হয়। তবে আমি অনুমান করি যে এটি পুনরাবৃত্তির পরিচিতি হিসাবে করবে
টমাস

5
সঠিক পরিভাষাটি হ'ল ফাংশনের বেশ কয়েকটি আমন্ত্রণ রয়েছে। প্রতিটি অনুরোধের ভেরিয়েবলগুলির নিজস্ব উদাহরণ রয়েছে aএবং b
থিওডোর নরভেল

6
হ্যাঁ, এই উত্তরের সাথে উল্লেখযোগ্য পরিমাণে নির্ভুলতা যুক্ত করা যেতে পারে। আমি ইচ্ছাকৃতভাবে "একটি ফাংশনের উদাহরণ" এবং "একটি ফাংশনের অনুরোধের অ্যাক্টিভেশন রেকর্ড" এর মধ্যে পার্থক্যটি ছেড়ে দিয়েছি, কারণ এটি অতিরিক্ত ধারণাগত বোঝা ছিল যা সমস্যাটি বুঝতে সহায়তা করে না। এটি অন্যান্য সমস্যাগুলি বোঝার ক্ষেত্রে সহায়তা করে , তাই এটি এখনও অন্য কোথাও দরকারী তথ্য। এই মন্তব্যগুলি এটির জন্য দুর্দান্ত জায়গা বলে মনে হচ্ছে :)
Catfish_Man

130

1. একটি শর্ত পূরণ না হওয়া পর্যন্ত ফাংশনটি পুনরাবৃত্তভাবে বলা হয়। সেই অবস্থা a > b। যখন এই শর্তটি পূরণ হয়, ফিরে যান ০. প্রথম নজরে, আমি প্রত্যাবর্তন মান 0 হওয়ার প্রত্যাশা করব যা স্পষ্টতই ভুল।

কম্পিউটার কম্পিউটিং sumInts(2,5)যদি এটি করতে সক্ষম হয় তবে তা কী মনে করবে তা এখানে :

I want to compute sumInts(2, 5)
for this, I need to compute sumInts(3, 5)
and add 2 to the result.
  I want to compute sumInts(3, 5)
  for this, I need to compute sumInts(4, 5)
  and add 3 to the result.
    I want to compute sumInts(4, 5)
    for this, I need to compute sumInts(5, 5)
    and add 4 to the result.
      I want to compute sumInts(5, 5)
      for this, I need to compute sumInts(6, 5)
      and add 5 to the result.
        I want to compute sumInts(6, 5)
        since 6 > 5, this is zero.
      The computation yielded 0, therefore I shall return 5 = 5 + 0.
    The computation yielded 5, therefore I shall return 9 = 4 + 5.
  The computation yielded 9, therefore I shall return 12 = 3 + 9.
The computation yielded 12, therefore I shall return 14 = 2 + 12.

আপনি দেখতে পাচ্ছেন, ফাংশনে কিছু কল sumIntsআসলে 0 ফেরত দেয় তবে এটি চূড়ান্ত মান নয় কারণ কম্পিউটারের এখনও 4 টি যোগ করতে হয় 0, তারপরে 4, তারপরে 3, তারপরে 2, চারটি শেষ বাক্য দ্বারা বর্ণিত আমাদের কম্পিউটারের চিন্তাভাবনা। নোট করুন যে পুনরাবৃত্তির ক্ষেত্রে কম্পিউটারকে কেবল পুনরাবৃত্তির কল গণনা করতে হয় না, এটি পুনরাবৃত্ত কল দ্বারা ফিরে আসা মানটির সাথে কী করতে হবে তাও মনে রাখতে হবে। স্ট্যাক নামে পরিচিত কম্পিউটারের মেমরির একটি বিশেষ ক্ষেত্র রয়েছে যেখানে এই ধরণের তথ্য সংরক্ষণ করা হয়, এই স্থানটি সীমাবদ্ধ এবং খুব বেশি পুনরাবৃত্তিযোগ্য ফাংশনগুলি স্ট্যাকটি নিঃশেষ করতে পারে: এটি স্ট্যাকের ওভারফ্লো আমাদের সর্বাধিক প্রিয় ওয়েবসাইটটির নাম দেয় name

আপনার বক্তব্যটি অন্তর্নিহিত ধারণাটি বলে মনে হচ্ছে যে একটি পুনরাবৃত্তি কল করার সময় কম্পিউটারটি যা ছিল তা ভুলে যায়, তবে তা হয় না, এ কারণেই আপনার উপসংহারটি আপনার পর্যবেক্ষণের সাথে মেলে না।

২. প্রতিটি পুনরাবৃত্তির উপর 'ক' এর মান ছাপানো এমন একটি মূল্য দেয় যা আমি প্রত্যাশা করি: 2, 3, 4, 5 (যে বিন্দুতে 5 + 1> বি প্রথম শর্তটি পূরণ করে: ক> খ) তবে আমি এখনও 14 এর মান কীভাবে অর্জিত হয় তা দেখুন না।

এটি কারণ রিটার্ন মানটি aনিজেই নয়, aতবে পুনরাবৃত্তির কল দ্বারা প্রাপ্ত মানের এবং তার মানের যোগফল ।


3
মাইকেল এই দুর্দান্ত উত্তর লিখতে সময় দেওয়ার জন্য ধন্যবাদ! +1 টি!
জেসন এলউড

9
@ জেসন এলউড সম্ভবত আপনি এটি পরিবর্তন করে যদি sumIntsএটি "কম্পিউটারের চিন্তাভাবনা" লিখে রাখে তবে এটি সহায়ক helpful একবার আপনি এই জাতীয় ফাংশনগুলির একটি হাত লিখেছেন, আপনি সম্ভবত "পেয়েছেন"!
মাইকেল লে বার্বিয়ার গ্রেনওয়াল্ড

4
এটি একটি উত্তম উত্তর, যদিও আমি লক্ষ করেছি যে "স্ট্যাক" নামে পরিচিত একটি ডেটা স্ট্রাকচারের জন্য ফাংশন অ্যাক্টিভেশন হওয়ার কোনও প্রয়োজন নেই । ধারাবাহিকতা পাসিং স্টাইল দ্বারা পুনরাবৃত্তি প্রয়োগ করা যেতে পারে, যেখানে কোনও স্ট্যাক নেই। স্ট্যাকটি কেবল একটি - বিশেষত দক্ষ এবং তাই সাধারণ ব্যবহারে - ধারাবাহিকতার ধারণার পুনর্বিবেচনা।
এরিক লিপার্ট

1
@ এরিকলিপার্ট যদিও পুনরাবৃত্তি বাস্তবায়নের জন্য কৌশলগুলি প্রতি এক আকর্ষণীয় বিষয় , তবে আমি নিশ্চিত নই যে এটি ওপি'র পক্ষে কার্যকর হবে কিনা - যারা "এটি কীভাবে কাজ করে" বুঝতে চায় - এটি বিভিন্ন ধরণের ব্যবস্থার সংস্পর্শে আসবে। ধারাবাহিকতা শৈলী বা সম্প্রসারণ ভিত্তিক ভাষা (যেমন TeX এবং M4) ক্ষণস্থায়ী হয় না অন্তর্নিহিত কঠিন আরো সাধারণ প্রোগ্রামিং paradigms চেয়ে সময় আমি এই "বহিরাগত" এবং একটি সামান্য লেবেল দ্বারা কেহ অপরাধ না মিথ্যা মত "এটা সবসময় ঘটে স্ট্যাকের 'উচিত ধারণাটি বুঝতে ওপিকে সহায়তা করুন। (এবং এক ধরণের স্ট্যাক সর্বদা জড়িত))
মাইকেল লে বার্বিয়ার গ্রোনাওয়াল্ড

1
সফ্টওয়্যারটি কী করছে তা মনে রাখার জন্য কিছু উপায় থাকতে হবে, ফাংশনটিকে পুনরাবৃত্তভাবে কল করুন এবং তারপরে ফিরে আসার পরে সেই আসল অবস্থায় ফিরে আসুন। এই প্রক্রিয়াটি স্ট্যাকের মতো কাজ করে, তাই এটিকে স্ট্যাক বলা সুবিধাজনক, এমনকি অন্য কিছু ডেটা স্ট্রাকচার ব্যবহার করা হলেও।
বার্মার

48

পুনরাবৃত্তি বুঝতে আপনার অবশ্যই সমস্যাটি অন্যভাবে ভাবতে হবে। পদক্ষেপগুলির বৃহত যৌক্তিক অনুক্রমের পরিবর্তে পুরোটি বোঝার পরিবর্তে আপনি একটি বড় সমস্যা গ্রহণ করেন এবং ছোট সমস্যাগুলিতে বিভক্ত হন এবং সেগুলি সমাধান করেন, একবার আপনার কাছে সাব সমস্যাগুলির জন্য একটি উত্তর হয়ে গেলে আপনি সাব সমস্যার ফলাফলগুলি সংযুক্ত করে ফেলুন আরও বড় সমস্যার সমাধান আপনি এবং আপনার বন্ধুদের একটি বিশাল বালতিতে মার্বেল সংখ্যা গণনা করা প্রয়োজন মনে করুন। আপনি প্রত্যেকে একটি ছোট বালতি নিয়ে যান এবং স্বতন্ত্রভাবে সেগুলি গণনা করতে পারেন এবং আপনার কাজ শেষ হলে আপনি যোগফলগুলি একসাথে যুক্ত করেন .. ঠিক এখন আপনারা প্রত্যেকে যদি কিছু বন্ধু খুঁজে পান এবং বালতিগুলি আরও বিভক্ত করেন, তবে আপনাকে কেবল এই অন্যান্য বন্ধুদের অপেক্ষা করতে হবে তাদের মোট সংখ্যা বের করুন, এটিকে আপনার প্রত্যেকের কাছে ফিরিয়ে আনুন, আপনি এটি যুক্ত করুন। ইত্যাদি।

আপনার অবশ্যই অবশ্যই মনে রাখতে হবে যখনই ফাংশনটি নিজেকে পুনরাবৃত্তি করে কল করে এটি সমস্যার সাবসেট সহ একটি নতুন প্রসঙ্গ তৈরি করে, সেই অংশটি সমাধান হয়ে গেলে এটি ফিরে আসে যাতে পূর্ববর্তী পুনরাবৃত্তিটি সম্পূর্ণ করতে পারে।

আমি আপনাকে পদক্ষেপগুলি দেখাতে দিন:

sumInts(a: 2, b: 5) will return: 2 + sumInts(a: 3, b: 5)
sumInts(a: 3, b: 5) will return: 3 + sumInts(a: 4, b: 5)
sumInts(a: 4, b: 5) will return: 4 + sumInts(a: 5, b: 5)
sumInts(a: 5, b: 5) will return: 5 + sumInts(a: 6, b: 5)
sumInts(a: 6, b: 5) will return: 0

একবার যোগফলগুলি (ক:,, বি: ৫) কার্যকর হয়ে গেলে, ফলাফলগুলি গণনা করা যেতে পারে সুতরাং আপনি প্রাপ্ত ফলাফলের সাথে শৃঙ্খলা ব্যাক আপ করতে পারেন:

 sumInts(a: 6, b: 5) = 0
 sumInts(a: 5, b: 5) = 5 + 0 = 5
 sumInts(a: 4, b: 5) = 4 + 5 = 9
 sumInts(a: 3, b: 5) = 3 + 9 = 12
 sumInts(a: 2, b: 5) = 2 + 12 = 14.

পুনরাবৃত্তির কাঠামোর প্রতিনিধিত্ব করার আরেকটি উপায়:

 sumInts(a: 2, b: 5) = 2 + sumInts(a: 3, b: 5)
 sumInts(a: 2, b: 5) = 2 + 3 + sumInts(a: 4, b: 5)  
 sumInts(a: 2, b: 5) = 2 + 3 + 4 + sumInts(a: 5, b: 5)  
 sumInts(a: 2, b: 5) = 2 + 3 + 4 + 5 + sumInts(a: 6, b: 5)
 sumInts(a: 2, b: 5) = 2 + 3 + 4 + 5 + 0
 sumInts(a: 2, b: 5) = 14 

2
খুব ভাল, রব। আপনি এটি এমনভাবে রেখেছেন যা খুব স্পষ্ট এবং সহজে বোঝা যায়। সময় দেবার জন্য ধন্যবাদ!
জেসন এলউড

3
এটি কী ঘটছে তার সুস্পষ্ট উপস্থাপনা এটির তত্ত্ব এবং প্রযুক্তিগত বিশদ না নিয়েই ফাঁসির প্রতিটি পদক্ষেপ পরিষ্কারভাবে দেখায়।
ব্রায়ান

2
আমি আনন্দিত. :) এই জিনিসগুলি ব্যাখ্যা করা সর্বদা সহজ নয়। প্রশংসার জন্য ধন্যবাদ.
রব

1
+1 টি। বিশেষত আপনার কাঠামোর শেষ উদাহরণটি দিয়ে আমি এটি বর্ণনা করব। এটি যা ঘটছে তা দৃশ্যত তালিকাভুক্ত করা সহায়ক helpful
কেচালাক্স

40

পুনরাবৃত্তি বোঝার জন্য একটি জটিল বিষয় এবং আমি মনে করি না যে আমি এখানে এটি পুরোপুরি ন্যায়বিচার করতে পারি। পরিবর্তে, আমি এখানে আপনার নির্দিষ্ট কোডের টুকরোটির দিকে মনোনিবেশ করার চেষ্টা করব এবং কেন সমাধানটি কাজ করে এবং কীভাবে কোড তার ফলাফলকে গণনা করে তার যান্ত্রিকতা উভয়ই বর্ণনা করার চেষ্টা করব।

আপনি এখানে যে কোডটি দিয়েছেন তা নিম্নলিখিত সমস্যার সমাধান করে: আপনি একটি থেকে বি, সমেত সমস্ত সংখ্যার যোগফল জানতে চান। আপনার উদাহরণস্বরূপ, আপনি 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 হয় - সীমাতে কোনও সংখ্যা নেই! অতএব, আমরা নিম্নলিখিত হিসাবে আমাদের সমাধান গঠন করব:

  1. যদি a> খ হয় তবে উত্তরটি 0 হবে।
  2. অন্যথায় (a ≤ b), উত্তরটি নিম্নরূপ পান:
    1. একটি + 1 এবং খ এর মধ্যে পূর্ণসংখ্যার যোগফল গণনা করুন।
    2. উত্তর পেতে একটি যুক্ত করুন।

এখন, এই সিডোকোডটিকে আপনার আসল কোডের সাথে তুলনা করুন:

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)? ঠিক আছে, এখানে যা ঘটেছিল:

  1. আপনি কল sumInts(5, 5)। আমরা elseশাখায় পড়ি, যা sum a + যোগফলগুলির (6, 5) এর মান প্রদান করে।
  2. sumInts(5, 5)কী sumInts(6, 5)তা নির্ধারণ করার জন্য , আমরা কী করছি তা বিরতি দিয়ে কল করতে হবে sumInts(6, 5)
  3. sumInts(6, 5)ডাকা হয়। এটি ifশাখায় প্রবেশ করে ফিরে আসে 0। যাইহোক, এই উদাহরণটি sumIntsদ্বারা ডাকা হয়েছিল sumInts(5, 5), সুতরাং ফেরতের মানটি sumInts(5, 5)শীর্ষ-স্তরের কলারের কাছে নয়, আবার যোগাযোগ করা হয়।
  4. 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 returns5 + 0 = 5` এ ফিরে আসে `
  • sumInts(4, 5)এখন sumInts(5, 5)5 এর মান রয়েছে , এটি 5 আবার আসে 4 + 5 = 9

অন্য কথায়, যে মানটি প্রত্যাবর্তিত হয় তা একবারে একটি করে মানগুলি যোগ করে গঠিত হয়, প্রতিটি সময় একটি নির্দিষ্ট পুনরাবৃত্ত কল দ্বারা প্রত্যাবর্তিত প্রতিটি মান গ্রহণ করে sumInts করে এবং এর বর্তমান মান যুক্ত করে গঠিত হয় a। যখন পুনরাবৃত্তি নীচে নেমে আসে, গভীরতম কলটি 0 ফিরে আসে However তবে, মানটি অবিলম্বে পুনরাবৃত্ত কল চেইন থেকে প্রস্থান করে না; পরিবর্তে, এটি কেবল মানটিকে তার উপরে একটি পুনরাবৃত্ত কলকে ফিরিয়ে দেয়। এইভাবে, প্রতিটি পুনরাবৃত্তি কল কেবল আরও একটি সংখ্যায় যুক্ত করে এবং এটি চেইনে উচ্চতর আপ দেয়, সামগ্রিক সংক্ষেপণের সাথে সমাপ্ত হয়। অনুশীলন হিসাবে, এটি খুঁজে বের করার চেষ্টা করুন sumInts(2, 5), যা আপনি শুরু করতে চেয়েছিলেন।

আশাকরি এটা সাহায্য করবে!


3
এরকম একটি বিস্তৃত উত্তর ভাগ করে নেওয়ার জন্য আপনার ব্যস্ততার বাইরে সময় দেওয়ার জন্য ধন্যবাদ! এখানে প্রচুর পরিমাণে দুর্দান্ত তথ্য রয়েছে যা আমাকে পুনরাবৃত্ত ক্রিয়াকলাপগুলি সম্পর্কে আমার মাথা পেতে সহায়তা করে এবং ভবিষ্যতে এই পোস্টটিতে হোঁচট খায় এমন অন্যদের অবশ্যই সহায়তা করবে। আবারও ধন্যবাদ এবং একটি অসাধারণ দিন কাটাও।
জেসন এলউড

22

আপনি এখন পর্যন্ত এখানে কিছু ভাল উত্তর পেয়েছেন, তবে আমি আরও একটি যুক্ত করব যা আলাদা ট্যাক্স নেয়।

প্রথমে, আমি সরল পুনরাবৃত্তির অ্যালগরিদমগুলিতে অনেকগুলি নিবন্ধ লিখেছি যা আপনার কাছে আকর্ষণীয় মনে হতে পারে; দেখা

http://ericlippert.com/tag/recursion/

http://blogs.msdn.com/b/ericlippert/archive/tags/recursion/

এগুলি সর্বাধিক শীর্ষে অর্ডারে রয়েছে তাই নীচ থেকে শুরু করুন।

দ্বিতীয়ত, এখনও পর্যন্ত সমস্ত উত্তর ফাংশন সক্রিয়করণ বিবেচনা করে পুনরাবৃত্ত শব্দার্থবিজ্ঞানের বর্ণনা দিয়েছে । প্রতিটি, প্রতিটি কল একটি নতুন অ্যাক্টিভেশন করে এবং পুনরাবৃত্ত কলটি এই অ্যাক্টিভেশনটির প্রসঙ্গে কার্যকর করে। এটি ভাবার জন্য এটি একটি ভাল উপায়, তবে অন্য একটি সমতুল্য উপায় রয়েছে: স্মার্ট পাঠ্য সীট-এবং-প্রতিস্থাপন

আমাকে আপনার ফাংশনটি আরও কিছুটা কমপ্যাক্ট আকারে আবার লিখতে দিন; এটি কোনও বিশেষ ভাষায় বলে মনে করবেন না।

s = (a, b) => a > b ? 0 : a + s(a + 1, b)

আমি আশা করি যে এটি উপলব্ধি করে। আপনি যদি শর্তসাপেক্ষ অপারেটরের সাথে পরিচিত না হন তবে এটি ফর্মেরcondition ? consequence : alternative এবং এর অর্থ পরিষ্কার হয়ে যাবে।

এখন আমরা মূল্যায়ন করতে ইচ্ছুক s(2,5) একটি পাঠগত ফাংশন শরীরের সঙ্গে কলের প্রতিস্থাপন করে আমরা পেরে থাকি, তাহলে প্রতিস্থাপন aসঙ্গে 2এবং bসঙ্গে 5:

s(2, 5) 
---> 2 > 5 ? 0 : 2 + s(2 + 1, 5)

এখন শর্তসাপেক্ষ মূল্যায়ন করুন। আমরা মূল পাঠ্য প্রতিস্থাপন 2 > 5সঙ্গে false

---> false ? 0 : 2 + s(2 + 1, 5)

এখন পাঠ্যগতভাবে সমস্ত মিথ্যা শর্তাদি বিকল্পের সাথে এবং ফলাফলের সাথে সমস্ত সত্য শর্তাবলীর সাথে প্রতিস্থাপন করুন। আমাদের কেবল ভ্রান্ত শর্তসাপেক্ষ রয়েছে, তাই আমরা সেই অভিব্যক্তিটিকে বিকল্পের সাথে পাঠ্যভাবে প্রতিস্থাপন করি:

---> 2 + s(2 + 1, 5)

এখন, এই সমস্ত +লক্ষণগুলি টাইপ করে আমাকে বাঁচাতে , পাঠ্যের সাথে ধ্রুবক গাণিতিকটিকে এর মান দিয়ে প্রতিস্থাপন করুন। (এটি কিছুটা প্রতারণা, তবে আমি চাই না যে সমস্ত প্রথম বন্ধনীর খোঁজ রাখতে হবে!)

---> 2 + s(3, 5)

এখন সন্ধান এবং প্রতিস্থাপন করুন, এবার কলটির 3জন্য, aএবং এর 5জন্য শরীরের সাথে । আমরা কলটির প্রতিস্থাপন বন্ধনীতে রেখে দেব:

---> 2 + (3 > 5 ? 0 : 3 + s(3 + 1, 5))

এবং এখন আমরা কেবল একই পাঠ্য প্রতিস্থাপনের পদক্ষেপগুলি চালিয়ে যাচ্ছি:

---> 2 + (false ? 0 : 3 + s(3 + 1, 5))  
---> 2 + (3 + s(3 + 1, 5))                
---> 2 + (3 + s(4, 5))                     
---> 2 + (3 + (4 > 5 ? 0 : 4 + s(4 + 1, 5)))
---> 2 + (3 + (false ? 0 : 4 + s(4 + 1, 5)))
---> 2 + (3 + (4 + s(4 + 1, 5)))
---> 2 + (3 + (4 + s(5, 5)))
---> 2 + (3 + (4 + (5 > 5 ? 0 : 5 + s(5 + 1, 5))))
---> 2 + (3 + (4 + (false ? 0 : 5 + s(5 + 1, 5))))
---> 2 + (3 + (4 + (5 + s(5 + 1, 5))))
---> 2 + (3 + (4 + (5 + s(6, 5))))
---> 2 + (3 + (4 + (5 + (6 > 5 ? 0 : s(6 + 1, 5)))))
---> 2 + (3 + (4 + (5 + (true ? 0 : s(6 + 1, 5)))))
---> 2 + (3 + (4 + (5 + 0)))
---> 2 + (3 + (4 + 5))
---> 2 + (3 + 9)
---> 2 + 12
---> 14

আমরা এখানে যা কিছু করেছি তা হ'ল সরল পাঠ্য প্রতিস্থাপন । সত্যিই আমার "2 + 1" এর জন্য "3" এবং অন্য কিছু করা উচিত ছিল না যতক্ষণ না আমার করা হয়েছিল, কিন্তু শিক্ষাগতভাবে এটি পড়া শক্ত হয়ে উঠত।

ফাংশন অ্যাক্টিভেশন কলটির মূল অংশের সাথে ফাংশন কলটি প্রতিস্থাপন করা এবং আনুষ্ঠানিক পরামিতিগুলি তাদের যুক্তিযুক্ত প্রতিস্থাপনের পরিবর্তে আর কিছু নয়। বুদ্ধিমানভাবে প্রথম বন্ধনী প্রবর্তন সম্পর্কে আপনাকে সতর্কতা অবলম্বন করতে হবে, তবে সেগুলি বাদ দিয়ে এটি কেবল পাঠ্য প্রতিস্থাপন।

অবশ্যই, বেশিরভাগ ভাষা আসলে পাঠ্য প্রতিস্থাপন হিসাবে অ্যাক্টিভেশন প্রয়োগ করে না , তবে যৌক্তিকভাবে এটি।

সুতরাং কি তাহলে একটি সীমাহীন পুনরাবৃত্তি হয়? এমন একটি পুনরাবৃত্তি যেখানে পাঠ্য প্রতিস্থাপন বন্ধ হয় না! খেয়াল করুন অবশেষে আমরা কীভাবে এমন একটি পদক্ষেপে পৌঁছেছি যেখানে sপ্রতিস্থাপনের মতো আর কোনও উপায় নেই এবং আমরা তখন পাটিগণিতের জন্য নিয়মগুলি প্রয়োগ করতে পারি।


ভাল উদাহরণ তবে আপনি আরও জটিল গণনা করতে গেলে আপনার হৃদয় ভেঙে যায়। যেমন। বাইনারি ট্রিতে সাধারণ পূর্বপুরুষের সন্ধান করা।
কোডইগি

11

বেসর কেসটি দেখে এবং পিছনের দিকে কাজ করে আমি যেভাবে একটি পুনরাবৃত্ত ফাংশনটি কীভাবে কাজ করে তা সাধারণত বের করি। এই কৌশলটি এখানে এই ফাংশনটিতে প্রয়োগ করা হয়েছে।

প্রথম বেস কেস:

sumInts(6, 5) = 0

তারপরে কল স্ট্যাকের ঠিক উপরে কল :

sumInts(5, 5) == 5 + sumInts(6, 5)
sumInts(5, 5) == 5 + 0
sumInts(5, 5) == 5

তারপরে কল স্ট্যাকের ঠিক উপরে কল:

sumInts(4, 5) == 4 + sumInts(5, 5)
sumInts(4, 5) == 4 + 5
sumInts(4, 5) == 9

এবং আরও:

sumInts(3, 5) == 3 + sumInts(4, 5)
sumInts(3, 5) == 3 + 9
sumInts(3, 5) == 12

এবং আরও:

sumInts(2, 5) == 2 + sumInts(3, 5)
sumInts(4, 5) == 2 + 12
sumInts(4, 5) == 14

লক্ষ্য করুন যে আমরা ফাংশনে আমাদের আসল কল এ এসেছি sumInts(2, 5) == 14

এই কলগুলি কার্যকর করা হয় সেই ক্রমে:

sumInts(2, 5)
sumInts(3, 5)
sumInts(4, 5)
sumInts(5, 5)
sumInts(6, 5)

এই কলগুলি যে ক্রমানুসারে ফিরে আসে:

sumInts(6, 5)
sumInts(5, 5)
sumInts(4, 5)
sumInts(3, 5)
sumInts(2, 5)

দ্রষ্টব্য যে আমরা কলগুলি যাতে ফিরে আসে তার ক্রমে ট্রেস করে কীভাবে ফাংশন পরিচালনা করে সে সম্পর্কে আমরা একটি সিদ্ধান্তে পৌঁছেছি ।


5

আমি এক বার যেতে হবে।

সমীকরণটি a + যোগফলগুলি (a + 1, b) সম্পাদন করে, আমি চূড়ান্ত উত্তরটি কীভাবে 14 করব তা দেখাব।

//the sumInts function definition
func sumInts(a: Int, b: Int) -> Int {
    if (a > b) {
        return 0
    } else {
        return a + sumInts(a + 1, b)
    }
}

Given: a = 2 and b = 5

1) 2 + sumInts(2+1, 5)

2) sumInts(3, 5) = 12
   i) 3 + sumInts(3+1, 5)
   ii) 4 + sumInts(4+1, 5)
   iii) 5 + sumInts(5+1, 5)
   iv) return 0
   v) return 5 + 0
   vi) return 4 + 5
   vii) return 3 + 9

3) 2 + 12 = 14.

আপনার আরও কিছু প্রশ্ন থাকলে আমাদের জানান know

নীচের উদাহরণে পুনরাবৃত্ত ফাংশনের আরও একটি উদাহরণ এখানে।

একজন লোক সবে কলেজ থেকে স্নাতক হয়েছে।

t বছরগুলিতে সময়ের পরিমাণ।

অবসর গ্রহণের আগে কাজ করা মোট প্রকৃত সংখ্যাটি নিম্নরূপ গণনা করা যেতে পারে:

public class DoIReallyWantToKnow 
{
    public int howLongDoIHaveToWork(int currentAge)
    {
      const int DESIRED_RETIREMENT_AGE = 65;
      double collectedMoney = 0.00; //remember, you just graduated college
      double neededMoneyToRetire = 1000000.00

      t = 0;
      return work(t+1);
    }

    public int work(int time)
    {
      collectedMoney = getCollectedMoney();

      if(currentAge >= DESIRED_RETIREMENT_AGE 
          && collectedMoney == neededMoneyToRetire
      {
        return time;
      }

      return work(time + 1);
    }
}

এবং যে কাউকে হতাশ করার জন্য যথেষ্ট হতে হবে, হ্যাঁ। ;-P


5

Recursion। কম্পিউটার সায়েন্সে পুনরাবৃত্তিটি ফিনাইট অটোমেটা শীর্ষক অধীনে গভীরভাবে আচ্ছাদিত।

এর সহজতম আকারে এটি একটি স্ব-রেফারেন্স। উদাহরণস্বরূপ, "আমার গাড়ি একটি গাড়ী" বলা একটি পুনরাবৃত্ত বিবৃতি। সমস্যাটি হ'ল বিবৃতিটি একটি অসীম পুনরাবৃত্তি যে এটি কখনই শেষ হবে না। "গাড়ী" এর বিবৃতিতে সংজ্ঞাটি এটি একটি "গাড়ি" তাই এটি প্রতিস্থাপন করা যেতে পারে। তবে এর শেষ নেই কারণ প্রতিস্থাপনের ক্ষেত্রে এটি এখনও "আমার গাড়ি একটি গাড়ি" হয়ে যায়।

"আমার গাড়িটি একটি বেন্টলি my আমার গাড়িটি নীল।" যে ক্ষেত্রে গাড়ীর দ্বিতীয় অবস্থার বিকল্পটি "বেন্টলি" হতে পারে যার ফলে "আমার বেন্টলি নীল"। কনটেক্সট-ফ্রি ব্যাকরণগুলির মাধ্যমে কম্পিউটার বিজ্ঞানে এই ধরণের বিকল্পগুলি গাণিতিকভাবে ব্যাখ্যা করা হয় ।

আসল প্রতিস্থাপন একটি উত্পাদন নিয়ম। প্রদত্ত বিবৃতিটি এস দ্বারা প্রতিনিধিত্ব করা হয়েছে এবং সেই গাড়ীটি একটি পরিবর্তনশীল যা "বেন্টলি" হতে পারে এই বিবৃতিটি পুনরাবৃত্তভাবে পুনর্গঠন করা যেতে পারে।

S -> "my"S | " "S | CS | "is"S | "blue"S | ε
C -> "bentley"

এটি প্রতিটি হিসাবে একাধিক উপায়ে নির্মিত যেতে পারে | উপায়ের মধ্যে একটি পছন্দ রয়েছে। Sএই পছন্দগুলির মধ্যে যে কোনও একটি দ্বারা প্রতিস্থাপন করা যেতে পারে এবং এস সর্বদা খালি শুরু হয়। εমানে উৎপাদন বিনষ্ট। যেমন Sপ্রতিস্থাপন করা যায়, তেমনি অন্যান্য ভেরিয়েবলগুলিও (এখানে কেবল একটি রয়েছে এবং এটি C"বেন্টলি" উপস্থাপন করবে)।

তাই দিয়ে শুরু S খালি থাকা এবং এটির পরিবর্তে প্রথম পছন্দটি "my"S Sহয়ে যায়

"my"S

Sএটি একটি পরিবর্তনশীল প্রতিনিধিত্বকারী হিসাবে এখনও প্রতিস্থাপিত হতে পারে। আমরা আবার "আমার" বা এটিকে শেষ করতে choose বেছে নিতে পারি, তবে আমাদের মূল বক্তব্যটি চালিয়ে যেতে দেওয়া যাক। আমরা স্থানটি বেছে নিয়েছি যার অর্থ Sপ্রতিস্থাপন করা হয়েছে" "S

"my "S

এরপরে সি নির্বাচন করতে দিন

"my "CS

এবং সি এর প্রতিস্থাপনের জন্য কেবল একটি পছন্দ রয়েছে

"my bentley"S

এবং স্পেস আবার এস জন্য

"my bentley "S

এবং তাই উপর "my bentley is"S,"my bentley is "S , "my bentley is blue"S, "my bentley is blue"(ε জন্য S প্রতিস্থাপন উৎপাদন শেষ হয়) এবং আমরা যাও recursively আমাদের বিবৃতি "আমার বেন্টলি নীল" তৈরি করেছি।

এই উত্পাদন এবং প্রতিস্থাপন হিসাবে পুনরাবৃত্তি ভাবেন। প্রক্রিয়াটির প্রতিটি পদক্ষেপ শেষ ফলাফল উত্পাদন করতে তার পূর্বসূরিকে প্রতিস্থাপন করে। 2 থেকে 5 পর্যন্ত পুনরাবৃত্ত রাশিটির সঠিক উদাহরণে আপনি উত্পাদনটি শেষ করেন

S -> 2 + A
A -> 3 + B
B -> 4 + C
C -> 5 + D
D -> 0

এটি হয়ে যায়

2 + A
2 + 3 + B
2 + 3 + 4 + C
2 + 3 + 4 + 5 + D
2 + 3 + 4 + 5 + 0
14

আমি নিশ্চিত নই যে সীমাবদ্ধ রাষ্ট্র অটোমেটা বা প্রসঙ্গমুক্ত ব্যাকরণ সর্বোত্তম উদাহরণ যা কোনও ব্যক্তিকে পুনরাবৃত্তি সম্পর্কে কিছু প্রথম স্বীকৃতি তৈরিতে সহায়তা করতে পারে। এগুলি দুর্দান্ত উদাহরণ, তবে পূর্ববর্তী সিএস ব্যাকগ্রাউন্ড না থাকা প্রোগ্রামারদের কাছে সম্ভবত কিছুটা অপরিচিত।
চি

4

আমি মনে করি পুনরাবৃত্ত ফাংশনগুলি বোঝার সর্বোত্তম উপায় হ'ল বুঝতে হবে যে তারা পুনরাবৃত্ত তথ্য স্ট্রাকচার প্রক্রিয়া করার জন্য তৈরি হয়েছিল। তবে আপনার আসল ফাংশনে sumInts(a: Int, b: Int)যা সংখ্যার যোগফলের থেকে পুনরাবৃত্তির জন্য গণনা aকরে b, এটি কোনও পুনরাবৃত্তির উপাত্ত কাঠামো বলে মনে হচ্ছে না ... আসুন sumInts(a: Int, n: Int)যেখানে কিছুটা পরিবর্তিত সংস্করণ চেষ্টা করিn আপনি কিছু সংখ্যক যুক্ত করবেন ।

এখন, যোগফলগুলি পুনরাবৃত্ত হয় n, একটি প্রাকৃতিক সংখ্যা। এখনও একটি পুনরাবৃত্ত তথ্য না, তাই না? ঠিক আছে, একটি প্রাকৃতিক সংখ্যাটি পিয়ানো অ্যাক্সিওমস ব্যবহার করে একটি পুনরাবৃত্ত ডেটা কাঠামো হিসাবে বিবেচনা করা যেতে পারে:

enum Natural = {
    case Zero
    case Successor(Natural)
}

সুতরাং, 0 = শূন্য, 1 = Succesor (জিরো), 2 = Succesor (Succesor (জিরো)), এবং আরও অনেক কিছু।

আপনার একবার এএ रिकर्सিভ ডেটা স্ট্রাকচার হয়ে গেলে আপনার ফাংশনের টেমপ্লেট থাকে। প্রতিটি নন পুনরাবৃত্তির ক্ষেত্রে, আপনি সরাসরি মান গণনা করতে পারেন। পুনরাবৃত্তির ক্ষেত্রে আপনি ধরে নিয়েছেন যে পুনরাবৃত্তি ফাংশন ইতিমধ্যে কাজ করছে এবং কেস গণনা করতে এটি ব্যবহার করে তবে যুক্তিটি ডিকনস্ট্রাক্ট করে। প্রাকৃতিক ক্ষেত্রে, এটা মানে হল যে পরিবর্তে Succesor(n)আমরা ব্যবহার করব n, অথবা equivalently পরিবর্তে nআমরা ব্যবহার করব n - 1

// sums n numbers beginning from a
func sumInts(a: Int, n: Int) -> Int {
    if (n == 0) {
        // non recursive case
    } else {
        // recursive case. We use sumInts(..., n - 1)
    }
}

এখন পুনরাবৃত্তি ফাংশন প্রোগ্রাম সহজ। প্রথম, বেস কেস,n=0 ,। আমরা কোনও সংখ্যা যুক্ত করতে চাইলে আমাদের কী ফিরিয়ে দেওয়া উচিত? উত্তর অবশ্যই 0।

পুনরাবৃত্তির ক্ষেত্রে কী হবে? যদি আমরা nশুরুতে সংখ্যা যুক্ত করতে চাই aএবং আমাদের ইতিমধ্যে একটি কার্যকরী sumIntsফাংশন রয়েছে যা এর জন্য কাজ করে n-1? ঠিক আছে, আমাদের যুক্ত করতে হবে aএবং তারপরেই প্রার্থনা sumIntsকরতে হবে a + 1, সুতরাং আমরা এখানেই শেষ করব:

// sums n numbers beginning from a
func sumInts(a: Int, n: Int) -> Int {
    if (n == 0) {
        return 0
    } else {
        return a + sumInts(a + 1, n - 1)
    }
}

সুন্দর জিনিসটি এখন আপনার পুনরাবৃত্তির নিম্ন স্তরের ভাবার দরকার নেই। আপনাকে কেবল এটি যাচাই করতে হবে:

  • পুনরাবৃত্তির উপাত্তের বেস কেসগুলির জন্য, এটি পুনরাবৃত্তি না ব্যবহার করে উত্তর গণনা করে।
  • পুনরাবৃত্তির উপাত্তগুলির পুনরাবৃত্তির ক্ষেত্রে এটি ডেস্ট্রাকচার্ড ডেটার উপরে পুনরাবৃত্তি ব্যবহার করে উত্তর গণনা করে।

4

আপনি নিসান এবং শকেনের কার্যকারিতা বাস্তবায়নে আগ্রহী হতে পারেন । লিঙ্কযুক্ত পিডিএফ একটি নিখরচায় অনলাইন কোর্সের অংশ। এটি ভার্চুয়াল মেশিন বাস্তবায়নের দ্বিতীয় অংশটি বর্ণনা করে যাতে শিক্ষার্থীকে ভার্চুয়াল-মেশিন-ভাষা থেকে মেশিন-ভাষা সংকলক লিখতে হবে। তারা প্রস্তাবিত ফাংশন বাস্তবায়ন পুনরাবৃত্তি করতে সক্ষম কারণ এটি স্ট্যাক-ভিত্তিক।

ফাংশন বাস্তবায়নের সাথে আপনাকে পরিচয় করিয়ে দেওয়ার জন্য: নিম্নলিখিত ভার্চুয়াল মেশিন কোডটি বিবেচনা করুন:

এখানে চিত্র বর্ণনা লিখুন

যদি সুইফট এই ভার্চুয়াল মেশিন ল্যাঙ্গুয়েজে সংকলিত হয়, তবে নিম্নলিখিতটি সুইফট কোডের ব্লক:

mult(a: 2, b: 3) - 4

নিচে সংকলন করা হবে

push constant 2  // Line 1
push constant 3  // Line 2
call mult        // Line 3
push constant 4  // Line 4
sub              // Line 5

ভার্চুয়াল মেশিনের ভাষা বিশ্বব্যাপী স্ট্যাকের চারপাশে নকশা করা হয়েছে ।push constant nএই গ্লোবাল স্ট্যাকের উপর একটি পূর্ণসংখ্যা ঠেলে দেয়।

1 এবং 2 লাইনগুলি কার্যকর করার পরে, স্ট্যাকটি দেখে মনে হচ্ছে:

256:  2  // Argument 0
257:  3  // Argument 1

256এবং 257মেমরি ঠিকানা।

call mult রিটার্ন লাইন নম্বর (3) স্ট্যাকের দিকে ঠেলা দেয় এবং ফাংশনের স্থানীয় ভেরিয়েবলগুলির জন্য স্থান বরাদ্দ করে।

256:  2  // argument 0
257:  3  // argument 1
258:  3  // return line number
259:  0  // local 0

... এবং এটি লেবেলে যায় function mult। ভিতরে কোডটি multকার্যকর করা হয় uted এই কোডটি কার্যকর করার ফলস্বরূপ আমরা 2 এবং 3 এর পণ্য গণনা করি যা ফাংশনের 0 তম স্থানীয় ভেরিয়েবলে সঞ্চিত থাকে।

256:  2  // argument 0
257:  3  // argument 1
258:  3  // return line number
259:  6  // local 0

returnবহু লোকের কাছ থেকে নামার আগে আপনি লাইনটি লক্ষ্য করবেন:

push local 0  // push result

আমরা পণ্যটিকে স্ট্যাকের দিকে ঠেলে দেব।

256:  2  // argument 0
257:  3  // argument 1
258:  3  // return line number
259:  6  // local 0
260:  6  // product

যখন আমরা ফিরে আসি, নিম্নলিখিতটি ঘটে:

  • 0 টি আর্গুমেন্টের মেমরি ঠিকানার (এই ক্ষেত্রে 256) স্ট্যাকের শেষ মানটি পপ করুন। এটি এটি রাখার জন্য সবচেয়ে সুবিধাজনক জায়গা বলে মনে হয়।
  • 0 টি আর্গুমেন্টের ঠিকানার পাতায় স্ট্যাকের সমস্ত কিছু ফেলে দিন।
  • রিটার্ন লাইনের নম্বরটিতে যান (এই ক্ষেত্রে 3) এবং তারপরে অগ্রসর হন।

ফিরে আসার পরে আমরা 4 লাইনটি কার্যকর করতে প্রস্তুত, এবং আমাদের স্ট্যাকটি দেখে মনে হচ্ছে:

256:  6  // product that we just returned

এখন আমরা স্ট্যাকের উপর 4 টিপুন।

256:  6
257:  4

subভার্চুয়াল মেশিন ভাষার একটি প্রাথমিক কাজ function এটি দুটি আর্গুমেন্ট নেয় এবং এর ফলাফলটি যথাযথ ঠিকানায় দেয়: 0 টি যুক্তি argument

এখন আমাদের আছে

256:  2  // 6 - 4 = 2

এখন আপনি জানেন যে কোনও ফাংশন কল কীভাবে কাজ করে, পুনরাবৃত্তি কীভাবে কাজ করে তা বোঝা তুলনামূলক সহজ। কোন জাদু নেই , কেবল একটি স্ট্যাক।

আমি sumIntsএই ভার্চুয়াল মেশিনের ভাষায় আপনার ফাংশনটি প্রয়োগ করেছি :

function sumInts 0     // `0` means it has no local variables.
  label IF
    push argument 0
    push argument 1
    lte              
    if-goto ELSE_CASE
    push constant 0
    return
  label ELSE_CASE
    push constant 2
    push argument 0
    push constant 1
    add
    push argument 1
    call sumInts       // Line 15
    add                // Line 16
    return             // Line 17
// End of function

এখন আমি এটি কল করব:

push constant 2
push constant 5
call sumInts           // Line 21

কোডটি কার্যকর করে এবং আমরা স্টপিং পয়েন্টে পৌঁছে যাই যেখানে lteফিরে আসে false। এই স্ট্যাকটি দেখতে এই মুহূর্তে:

// First invocation
256:  2   // argument 0
257:  5   // argument 1
258:  21  // return line number
259:  2   // augend
// Second
260:  3   // argument 0
261:  5   // argument 1
262:  15  // return line number
263:  3   // augend
// Third
264:  4   // argument 0
265:  5   // argument 1
266:  15  // return line number
267:  4   // augend
// Fourth
268:  5   // argument 0
269:  5   // argument 1
270:  15  // return line number
271:  5   // augend
// Fifth
272:  6   // argument 0
273:  5   // argument 1
274:  15  // return line number
275:  0   // return value

এখন আসুন আমাদের পুনরাবৃত্তি "উদ্বোধন করুন"। return0 এবং গেটো লাইন 15 এবং অগ্রিম।

271:  5
272:  0

লাইন 16: add

271:  5

লাইন 17: return5 এবং 15 এর আগে লাইন এবং অগ্রিম।

267:  4
268:  5

লাইন 16: add

267:  9

লাইন 17: return9 এবং গোটো লাইন 15 এবং অগ্রিম।

263:  3
264:  9

লাইন 16: add

263:  12

লাইন 17: return12 এবং 15 এর আগে লাইন এবং অগ্রিম।

259:  2
260:  12

লাইন 16: add

259:  14

লাইন 17: return14 এবং লোটো 21 এবং অগ্রিম advance

256:  14

ওখানে তোমার আছে। পুনরাবৃত্তি: মহিমান্বিত goto


4

সত্যিকারের একটি ভাল টিপ আমি শিখতে পেরেছি এবং সত্যিকারের পুনরাবৃত্তি বুঝতে পেরেছি এমন একটি ভাষা শেখার জন্য কিছুটা সময় ব্যয় করা যা পুনরাবৃত্তির মাধ্যমে লুপ কনস্ট্রাক্টের কোনও রূপই রাখে না। অনুশীলনের মাধ্যমে পুনরাবৃত্তি কীভাবে ব্যবহার করতে হয় তার জন্য আপনি দুর্দান্ত অনুভূতি পাবেন।

আমি http://www.htdp.org/ অনুসরণ করেছি , যা একটি স্কিম টিউটোরিয়াল হওয়ার পাশাপাশি আর্কিটেকচার এবং ডিজাইনের ক্ষেত্রে প্রোগ্রামগুলি কীভাবে ডিজাইন করা যায় সে সম্পর্কেও একটি দুর্দান্ত ভূমিকা।

তবে মূলত আপনার কিছুটা সময় বিনিয়োগ করতে হবে। পুনরাবৃত্তিগুলির 'দৃ'়' উপলব্ধি ব্যতীত ব্যাকট্র্যাকিংয়ের মতো নির্দিষ্ট অ্যালগরিদম আপনার কাছে সর্বদা 'শক্ত' বা এমনকি 'যাদু' বলে মনে হবে। সুতরাং, অধ্যবসায়ী। :-D

আমি আশা করি এটি সাহায্য করে এবং শুভকামনা!


3

ইতিমধ্যে অনেক ভাল উত্তর আছে। তবুও চেষ্টা করছি।
যখন ডাকা হয়, একটি ফাংশন বরাদ্দকৃত একটি মেমরি-স্পেস পান , যা কলার ফাংশনের মেমরি-স্পেসের উপরে সজ্জিত। এই মেমরি-স্পেসে, ফাংশনটি প্যারামিটারগুলিতে, ভেরিয়েবলগুলি এবং তাদের মানগুলিকে রেখে দেয়। এই স্মৃতি-স্থানটি ফাংশনের শেষ রিটার্ন কলের সাথে অদৃশ্য হয়ে যায়। স্ট্যাকের ধারণাটি যাওয়ার সাথে সাথে, কলার ফাংশনের মেমরি-স্পেস এখন সক্রিয় হয়।

পুনরাবৃত্তির কলগুলির জন্য, একই ফাংশনটি একের পর এক স্ট্র্যাকড একাধিক মেমরি-স্পেস পায় । এখানেই শেষ. কোনও কম্পিউটারের স্মৃতিতে স্ট্যাক কীভাবে কাজ করে তার সাধারণ ধারণাটি বাস্তবায়নে পুনরাবৃত্তি কীভাবে ঘটে তার ধারণার মাধ্যমে আপনাকে পাওয়া উচিত।


3

কিছুটা অফ-টপিক, আমি জানি, কিন্তু ... গুগলে পুনরাবৃত্তি সন্ধান করার চেষ্টা করুন ... আপনি উদাহরণস্বরূপ দেখতে পাবেন এর অর্থ :-)


গুগলের পূর্ববর্তী সংস্করণগুলি নিম্নলিখিত পাঠ্যটি (স্মৃতি থেকে উদ্ধৃত) ফেরত দিয়েছে:

recursion

পুনরাবৃত্তি দেখুন

10 ই সেপ্টেম্বর 2014, পুনরাবৃত্তি সম্পর্কে রসিকতা আপডেট করা হয়েছে:

recursion

আপনার অর্থ কি: পুনরুক্তি


অন্য উত্তরের জন্য, এই উত্তরটি দেখুন


3

একাধিক ক্লোন একই জিনিস করছে বলে পুনরাবৃত্তি ভাবেন ...

আপনি ক্লোন করতে বলেছেন [1]: "2 থেকে 5 এর মধ্যে যোগফলগুলি"

+ clone[1]               knows that: result is 2 + "sum numbers between 3 and 5". so he asks to clone[2] to return: "sum numbers between 3 and 5"
|   + clone[2]           knows that: result is 3 + "sum numbers between 4 and 5". so he asks to clone[3] to return: "sum numbers between 4 and 5"
|   |   + clone[3]       knows that: result is 4 + "sum numbers between 5 and 5". so he asks to clone[4] to return: "sum numbers between 5 and 5"
|   |   |   + clone[4]   knows that: result is 5 + "sum numbers between 6 and 5". so he asks to clone[5] to return: "sum numbers between 6 and 5"
|   |   |   |   clone[5] knows that: he can't sum, because 6 is larger than 5. so he returns 0 as result.
|   |   |   + clone[4]   gets the result from clone[5] (=0)  and sums: 5 + 0,  returning 5
|   |   + clone[3]       gets the result from clone[4] (=5)  and sums: 4 + 5,  returning 9
|   + clone[2]           gets the result from clone[3] (=9)  and sums: 3 + 9,  returning 12
+ clone[1]               gets the result from clone[2] (=12) and sums: 2 + 12, returning 14

এবং voilá !!


2

উপরের উত্তরগুলির অনেকগুলি খুব ভাল। যদিও পুনরাবৃত্তি সমাধানের জন্য একটি দরকারী কৌশলটি হ'ল আমরা কী করতে চাই তা প্রথমে বানান করা এবং একটি মানুষ হিসাবে কোডটি এটি সমাধান করবে। উপরের ক্ষেত্রে, আমরা একটানা পূর্ণসংখ্যার ক্রম যোগ করতে চাই (উপরের সংখ্যাগুলি ব্যবহার করে):

2, 3, 4, 5  //adding these numbers would sum to 14

এখন, নোট করুন যে এই লাইনগুলি বিভ্রান্ত করছে (ভুল নয়, তবে বিভ্রান্তিকর)।

if (a > b) {
    return 0 
}

কেন পরীক্ষা?, a>bএবং কেনreturn 0

একটি মানুষ কী করে তার আরও নিবিড়ভাবে প্রতিবিম্বিত করতে কোডটি পরিবর্তন করা যাক

func sumInts(a: Int, b: Int) -> Int {
  if (a == b) {
    return b // When 'a equals b' I'm at the most Right integer, return it
  }
  else {
    return a + sumInts(a: a + 1, b: b)
  }
}

আমরা কি আরও বেশি মানুষের মতো এটি করতে পারি? হ্যাঁ! সাধারণত আমরা বাম থেকে ডানে (2 + 3 + ...) যোগ করি। তবে উপরের পুনরাবৃত্তি ডান থেকে বামে সংশ্লেষ করছে (... + 4 + 5)। কোডটি প্রতিবিম্বিত করতে পরিবর্তন করুন (এটি -কিছুটা ভয় দেখানো হতে পারে তবে খুব বেশি কিছু নয়)

func sumInts(a: Int, b: Int) -> Int {
  if (a == b) {
    return b // When I'm at the most Left integer, return it
  }
  else {
    return sumInts(a: a, b: b - 1) + b
  }
}

কেউ কেউ এই ফাংশনটিকে আরও বিভ্রান্ত মনে করতে পারেন যেহেতু আমরা 'দূর' থেকে শুরু করছি, তবে অনুশীলন করা এটিকে প্রাকৃতিক বোধ করতে পারে (এবং এটি অন্য একটি ভাল 'চিন্তাভাবনা কৌশল: পুনরাবৃত্তি সমাধানের সময়' উভয় পক্ষের চেষ্টা করা)। এবং আবারও, ফাংশনটি প্রতিবিম্বিত করে যে কোনও মানুষ (সর্বাধিক?) কী করে: সমস্ত বাম পূর্ণসংখ্যার যোগফল নিয়ে যায় এবং 'পরবর্তী' ডান পূর্ণসংখ্যা যুক্ত করে।


2

পুনরাবৃত্তি বুঝতে আমার খুব কষ্ট হচ্ছিল তখন আমি এই ব্লগটি পেয়েছি এবং আমি ইতিমধ্যে এই প্রশ্নটি দেখেছি তাই আমি ভেবেছিলাম আমাকে অবশ্যই ভাগ করে নিতে হবে। আপনার অবশ্যই এই ব্লগটি অবশ্যই পড়তে হবে এবং এটি স্ট্যাকের সাথে ব্যাখ্যা করে এবং এমনকি এটি কীভাবে দুটি পুনরাবৃত্তি স্ট্যাক ধাপে ধাপে কাজ করে তা ব্যাখ্যা করে found আমি আপনাকে প্রথমে বোঝার প্রস্তাব দিচ্ছি যে স্ট্যাক কীভাবে কাজ করে যা এটি এখানে খুব ভালভাবে ব্যাখ্যা করে : ভ্রমণ-থেকে-স্ট্যাক

then now you will understand how recursion works now take a look of this post: ধাপে ধাপে পুনরাবৃত্তি বুঝতে

এখানে চিত্র বর্ণনা লিখুন

এটি একটি প্রোগ্রাম:

def hello(x):
    if x==1:
        return "op"
    else:
        u=1
        e=12
        s=hello(x-1)
        e+=1
        print(s)
        print(x)
        u+=1
    return e

hello(3)

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন


2

পুনরাবৃত্তি আমার কাছে বোধগম্য হতে শুরু করে যখন আমি অন্যেরা এর সম্পর্কে যা বলে তা পড়া বন্ধ করে দিয়েছিলাম বা এড়াতে পারি এমন কিছু হিসাবে এটি দেখে এবং কোড লিখেছিলাম। আমি একটি সমাধান নিয়ে একটি সমস্যা পেয়েছি এবং সন্ধান না করে সমাধানটির সদৃশ করার চেষ্টা করেছি। অসহায়ভাবে আটকে গেলে আমি কেবল সমাধানটির দিকে চেয়েছিলাম। তারপরে আমি এটির সদৃশ করার চেষ্টা করে ফিরে গেলাম। আমি কীভাবে পুনরাবৃত্ত সমস্যাটি সনাক্ত করতে এবং এটি সমাধান করতে পারি তার নিজের বোঝাপড়া এবং ধারণাটি তৈরি না করা পর্যন্ত আমি এটি একাধিক সমস্যার মধ্যে আবার করেছি। আমি যখন এই স্তরে পৌঁছেছি, তখন আমি সমস্যাগুলি তৈরি করতে এবং সেগুলি সমাধান করতে শুরু করি। এটি আমাকে আরও সাহায্য করেছে। কখনও কখনও, জিনিসগুলি কেবল নিজের দ্বারা চেষ্টা করে এবং সংগ্রাম করেই শেখা যায়; যতক্ষণ না আপনি "এটি পান"।


0

ফিবোনাচি সিরিজের একটি উদাহরণ দিয়ে বলি, ফিবোনাচি হলেন

t (n) = t (n - 1) + n;

যদি এন = 0 হয় তবে 1

সুতরাং আসুন কীভাবে পুনরাবৃত্তি কাজ করে তা দেখুন, আমি ঠিক nএর t(n)সাথে আরও অনেক কিছু প্রতিস্থাপন করি n-1। এটি দেখতে:

t (n-1) = t (n - 2) + n + 1;

t (n-1) = t (n - 3) + n + 1 + n;

t (n-1) = t (n - 4) + n + 1 + n + 2 + n;

টি (এন) = টি (এনকে) + ... + (এনকে -৩) + (এনকে -২) + (এনকে -১) + এন;

আমরা জানি যদি t(0)=(n-k)সমান 1তারপর n-k=0তাই n=kআমরা প্রতিস্থাপন kসঙ্গে n:

টি (এন) = টি (এনএন) + ... + (এন-এন + 3) + (এন-এন + 2) + (এন-এন + 1) + এন;

আমরা যদি বাদ দিই n-n:

টি (এন) = টি (0) + ... + 3 + 2 + 1 + (এন-1) + এন;

সুতরাং 3+2+1+(n-1)+n প্রাকৃতিক সংখ্যা। এটি হিসাবে গণনাΣ3+2+1+(n-1)+n = n(n+1)/2 => n²+n/2

ফাইব জন্য ফলাফল: O(1 + n²) = O(n²)

এটি পুনরাবৃত্তির সম্পর্কটি বোঝার সেরা উপায়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.