সরল ইংরেজিতে, পুনরাবৃত্তি কি?


74

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




1
পুনরাবৃত্তি হয় যখন কোনও ফাংশন নিজে কল করতে পারে। "যদি আপনি সম্পূর্ণরূপে নামের ক্ষেত্রগুলি এবং স্কোপটি বুঝতে পারেন এবং কোনও ফাংশনে কীভাবে প্যারামিটারগুলি পাস করা হয় তবে আপনি ইতিমধ্যে পুনরাবৃত্তিটি জানেন I আমি উদাহরণগুলি দেখাতে পারি, তবে তারা কীভাবে নিজেরাই কাজ করে তা আপনি নির্ধারণ করতে সক্ষম হবেন।" শিক্ষার্থীরা সাধারণত পুনরাবৃত্তি নিয়ে এতটা লড়াই করে না কারণ এটি বিভ্রান্তিকর, তবে কারণ তাদের ভেরিয়েবল স্কোপ / নেমস্পেসের দৃ gra় উপলব্ধি নেই। পুনরাবৃত্তিতে ডুব দেওয়ার আগে নিশ্চিত করুন যে শিক্ষার্থীরা এমন কোনও প্রোগ্রামের মাধ্যমে সঠিকভাবে সনাক্ত করতে পারে যেখানে আপনি উদ্দেশ্যমূলকভাবে বিভিন্ন স্কোপে ভেরিয়েবলগুলি একই বিভ্রান্ত করার জন্য দিয়েছেন given
dspyz


1
পুনরাবৃত্তি বুঝতে, আপনাকে অবশ্যই পুনরাবৃত্তিটি বুঝতে হবে
গোরম্যান

উত্তর:


110

পুনরাবৃত্তি ব্যাখ্যা করতে , আমি সাধারণত উভয় চেষ্টা করার জন্য বিভিন্ন ব্যাখ্যা সংমিশ্রণ ব্যবহার:

  • ধারণাটি ব্যাখ্যা করুন,
  • কেন এটি গুরুত্বপূর্ণ তা ব্যাখ্যা করুন,
  • কিভাবে এটি পেতে ব্যাখ্যা করুন।

প্রারম্ভিকদের জন্য, ওল্ফ্রাম | আলফা এটিকে উইকিপিডিয়া থেকে আরও সহজ পদে সংজ্ঞায়িত করে :

প্রতিটি শব্দ একটি নির্দিষ্ট গাণিতিক ক্রিয়াকলাপ পুনরাবৃত্তি দ্বারা উত্পাদিত হয় যেমন একটি অভিব্যক্তি।


গণিতশাস্ত্র

আপনার ছাত্র (বা ব্যক্তি আপনি এখন থেকে খুব ব্যাখ্যা আমি ছাত্র বলবো) অন্তত কিছু গাণিতিক পটভূমি থাকলে, সেগুলি স্পষ্টত ইতিমধ্যে পুনরাবৃত্তির সিরিজ এবং তাদের ধারণা অধ্যয়নরত সম্মুখীন হয়েছি recursivity এবং তাদের পুনরাবৃত্তি সম্পর্ক

শুরু করার খুব ভাল উপায় হ'ল একটি সিরিজ দিয়ে তা প্রদর্শন করা এবং তা বলা সহজ যে পুনরাবৃত্তিটি কী তা সম্পর্কে:

  • একটি গাণিতিক ফাংশন ...
  • ... এটি একটি এন-তৃতীয় উপাদানের সাথে সম্পর্কিত একটি মান গণনা করার জন্য নিজেকে কল করে ...
  • ... এবং যা কিছু সীমানা সংজ্ঞায়িত করে।

সাধারণত, আপনি হয় "হু হু, ওয়াতেভ" সেরা পান কারণ তারা এখনও এটি ব্যবহার করে না, বা সম্ভবত খুব গভীর ঘ্রাণ হয়।


কোডিং উদাহরণ

বাকি জন্য, এটি আসলে কি আমি উপস্থাপন করা একটি বিস্তারিত সংস্করণ সংযোজন এর আমার উত্তর জন্য প্রশ্ন সংক্রান্ত পয়েন্টার প্রতি ইঙ্গিত (খারাপ শ্লেষ)।

এই পর্যায়ে, আমার শিক্ষার্থীরা সাধারণত স্ক্রিনে কিছু মুদ্রণ করতে জানে। ধরে নেওয়া যাক আমরা সি ব্যবহার করছি, তারা কীভাবে writeবা ব্যবহার করে একক চর মুদ্রণ করতে জানে printf। তারা নিয়ন্ত্রণ লুপ সম্পর্কেও জানেন।

আমি সাধারণত কয়েকটি পুনরাবৃত্তিমূলক এবং সাধারণ প্রোগ্রামিং সমস্যাগুলি না পাওয়া পর্যন্ত তাদের অবলম্বন করি:

  • গৌণিক অপারেশন
  • একটি বর্ণমালা প্রিন্টার,
  • বিপরীত বর্ণমালা প্রিন্টার,
  • exponentation অপারেশন।

গৌণিক

কারখানাটি বোঝার জন্য একটি খুব সাধারণ গণিত ধারণা, এবং বাস্তবায়নটি এর গাণিতিক উপস্থাপনার খুব কাছাকাছি। তবে তারা প্রথমে এটি পেতে পারে না।

ফ্যাক্টরিয়াল অপারেশন এর পুনরাবৃত্তি সংজ্ঞা

বর্ণমালা

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

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

Exponentiation

ক্ষমতার সমস্যাটি কিছুটা বেশি কঠিন ( শেখার এই পর্যায়ে )। স্পষ্টতই ধারণাটি বাস্তবে সম্পর্কিত হিসাবে ঠিক একই রকম এবং এতে কোনও জটিলতা নেই ... কেবলমাত্র আপনার একাধিক পরামিতি রয়েছে। এবং এটি সাধারণত মানুষকে বিভ্রান্ত করতে এবং শুরুতে তাদের ফেলে দিতে যথেষ্ট।

এর সাধারণ ফর্ম:

ক্ষয়ক্ষতি অপারেশন এর সহজ ফর্ম

পুনরাবৃত্তি দ্বারা এটি প্রকাশ করা যেতে পারে:

ক্ষয়ক্ষতি অপারেশন জন্য পুনরাবৃত্তি সম্পর্কিত

কঠিনতর

এই সাধারণ সমস্যাগুলি একবার টিউটোরিয়ালগুলিতে প্রদর্শিত এবং পুনরায় প্রয়োগ করা হলে আপনি কিছুটা আরও কঠিন (তবে খুব ক্লাসিক) অনুশীলন দিতে পারেন:

দ্রষ্টব্য: আবার, এর মধ্যে কিছু সত্যিই খুব কঠিন নয় ... তারা ঠিক একই কোণ বা কিছুটা আলাদা থেকে সমস্যাটি দেখায়। অনুশীলন নিখুঁত করে তোলে।


সাহায্যকারী

একটি রেফারেন্স

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

শ্রেনী / গভীরতা

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

স্ট্যাক-এ-ড্রয়ার্স ডায়াগ্রাম

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

পুনরাবৃত্তি সংক্ষিপ্ত শব্দ

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

রিকার্সিভ:

  • জিএনইউ - "জিএনইউ'র ইউনিক্স নয়"
  • নাগিওস - "নাগিওস সাঁইথুডের উপর জোর দেবে না"
  • পিএইচপি - "পিএইচপি হাইপারটেক্সট প্রিপ্রসেসর" (এবং মূল "ব্যক্তিগত হোম পৃষ্ঠা")
  • ওয়াইন - "ওয়াইন একটি এমুলেটর নয়"
  • জিল - "জিল হ'ল লসী ইমাকস"

পারস্পরিক পুনরাবৃত্তি:

  • এইচআরডি - "ইউনিক্স-রিপ্লেসিং ডেমনস এর এইচআইআরডি" (যেখানে এইচআইআরডি হ'ল "গভীরতার প্রতিনিধিত্বকারী ইন্টারফেসগুলির এইচআরডি")

তাদের নিজের সাথে আসতে চেষ্টা করুন।

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


বিপদ এবং আরও পড়াশোনা

কিছু সমস্যা যার সাথে লোকেরা সাধারণত লড়াই করে এবং এর জন্য আপনার উত্তরগুলি জানা দরকার।

কেন, হে আল্লাহ কেন ???

তুমি ওটা কেন করবে? একটি ভাল তবে অপ্রত্যাশিত কারণটি হ'ল প্রায়শই সেইরকম সমস্যা প্রকাশ করা সহজ। একটি তাত্পর্যপূর্ণ না হলেও সুস্পষ্ট কারণ হ'ল এটি প্রায়শই কম টাইপ করে (যদিও কেবল পুনরাবৃত্তি ব্যবহারের জন্য তাদেরকে soooo l33t বোধ করবেন না ...)।

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

আবার কি ??

আমার nবা (আপনার পরিবর্তকের নাম যাই হোক না কেন) প্রতিবার আলাদা হয়? ভেরিয়েবল এবং প্যারামিটার কী তা বুঝতে প্রাথমিকভাবে সমস্যা হয় nএবং আপনার প্রোগ্রামে নামযুক্ত জিনিসগুলির কীভাবে আলাদা আলাদা মান থাকতে পারে। সুতরাং এখন যদি এই মান নিয়ন্ত্রণ লুপ বা পুনরাবৃত্তি হয়, এটি আরও খারাপ! সুন্দর হোন এবং সর্বত্র একই পরিবর্তনশীল নামগুলি ব্যবহার করবেন না এবং এটি পরিষ্কার করুন যে প্যারামিটারগুলি কেবল পরিবর্তনশীল

শর্তসমূহ শেষ

আমি আমার শেষ অবস্থাটি কীভাবে নির্ধারণ করব? এটি সহজ, কেবল তাদের উচ্চ পদক্ষেপগুলি উচ্চস্বরে বলতে দিন। উদাহরণস্বরূপ 5 থেকে শুরু, তারপর 4, তারপরে ... 0 পর্যন্ত 0।

শয়তান বিশদে রয়েছে

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

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

তবে দয়া করে যথাযথ সময়ে এটি পরিষ্কার করুন যে পুনরাবৃত্তি বা পুনরাবৃত্ত রুটে যাওয়ার কারণ রয়েছে

পারস্পরিক পুনরাবৃত্তি

আমরা দেখেছি যে ফাংশনগুলি পুনরাবৃত্ত হতে পারে এবং এমনকি তাদের একাধিক কল পয়েন্ট থাকতে পারে (8-কুইনস, হ্যানয়, ফিবোনাচি এমনকি মাইনসাইপারের জন্য অনুসন্ধানের অ্যালগরিদম)। তবে পারস্পরিক পুনরাবৃত্তি কলগুলি কী? এখানেও গণিত দিয়ে শুরু করুন। f(x) = g(x) + h(x)যেখানে g(x) = f(x) + l(x)এবং hএবং lমাত্র কাপড় না।

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

Hofstadter এর পুরুষ এবং মহিলা ক্রম

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


5
আমি আপনার উত্তরটি প্রায় 5 তম বা 6th ষ্ঠ সময় পরে এটি পড়ার পরে পড়ছি। আমি মনে করি এটি অন্য ব্যবহারকারীদের আকর্ষণ করার জন্য এটি দুর্দান্ত তবে খুব দীর্ঘ ছিল। আমি এখানে পাঠ্য পুনর্বিবেচনা সম্পর্কে অনেক কিছু শিখেছি। একজন শিক্ষক হিসাবে, আপনি দয়া করে পুনরাবৃত্তির পাঠদানের জন্য আমার ধারণাটি মূল্যায়ন করবেন- প্রোগ্রামার্স.স্ট্যাকেক্সেঞ্জার
গুলশান

9
@ গুলশান, আমি মনে করি যে এই উত্তরটি যতটা বিস্তৃত হবে ততটা ব্যাপক এবং একটি নৈমিত্তিক পাঠক সহজেই 'স্কিমড' করতে পারেন। অতএব, এটি static unsigned int vote = 1;আমার কাছ থেকে পেয়েছে। স্থির রসিকতাটি ক্ষমা করুন, যদি আপনি করেন :) এটি এখন পর্যন্ত সেরা উত্তর।
টিম পোস্ট

1
@ গুলসান: যে কেবল শিখতে চায় সে সময় নিতে সঠিকভাবে ইচ্ছুক :) আমি আসলেই কিছু মনে করি না। কখনও কখনও, একটি সংক্ষিপ্ত উত্তর মার্জিত হয় এবং একটি সাধারণ ধারণা শুরু করতে বা ব্যাখ্যা করতে প্রচুর দরকারী এবং প্রয়োজনীয় তথ্য সরবরাহ করে। আমি কেবল তার উত্তরটির জন্য একটি দীর্ঘ উত্তর চেয়েছিলাম, এবং ওপি এমন একটি প্রশ্নের উল্লেখ করেছে যার জন্য আমাকে "সঠিক" উত্তর দেওয়া হয়েছিল এবং অনুরূপ উত্তর জিজ্ঞাসা করেছি, আমি একই ধরণের উত্তর সরবরাহ করা উপযুক্ত বলে মনে করেছি t আপনি কিছু শিখেছি খুশি।
হাইলেম

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

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

58

একই ফাংশনের মধ্যে থেকে একটি ফাংশন কলিং।


2
এটি সত্যই থেকে শুরু করার সেরা ব্যাখ্যা। সহজ এবং যথাযথ; একবার আপনি এই সংক্ষিপ্তসারটি স্থাপন করলে, সমস্ত হেড-ট্রিপের বিশদে .ুকুন।
জোকিং করা

27

পুনরাবৃত্তি একটি ফাংশন যা নিজেকে কল করে।

কীভাবে এটি ব্যবহার করবেন, কখন এটি ব্যবহার করবেন এবং কীভাবে খারাপ নকশা এড়ানো যায় তা জানা গুরুত্বপূর্ণ, যার জন্য আপনার নিজের জন্য এটি চেষ্টা করা দরকার এবং কী ঘটে তা বোঝে।

আপনার যে সর্বাধিক গুরুত্বপূর্ণ বিষয়টি জানতে হবে তা হল কখনই শেষ না হওয়া এমন লুপটি না পাওয়ার জন্য খুব সাবধানতা অবলম্বন করা। প্রমোডক 84৪ থেকে আপনার প্রশ্নের উত্তরের এই দোষ রয়েছে: এটি কখনই শেষ হয় না ...
পুনরাবৃত্তির ক্রিয়াকলাপে সর্বদা একটি শর্ত পরীক্ষা করে অবশ্যই এটি আবার কল করা উচিত কিনা তা নির্ধারণ করতে হবে।

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


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

@ হাইলেম: "কীভাবে এটি ব্যবহার করবেন, কখন এটি ব্যবহার করবেন এবং কীভাবে খারাপ নকশা এড়ানো যায় .." - এর উত্তর সম্পর্কে আপনি ঠিকই বলেছেন, ওপি যা জিজ্ঞাসা করেছে তার চেয়ে বেশি স্পষ্ট হবে (কেবল "নিজের জন্য এটি চেষ্টা করে দেখবেন না) "যেমনটি আমি বলেছি), তবে এর জন্য এখানে একটি প্রশ্নের তাত্ক্ষণিক উত্তর না দিয়ে আরও অধিকতর শিক্ষণ ধরণের বিস্তৃত বক্তৃতা প্রয়োজন। আপনি যদিও আপনার উত্তর দিয়ে খুব ভাল কাজ করেছেন । এটির জন্য +1 ... যাদের ধারণাটির সত্যিকার অর্থে আরও ভাল উপলব্ধি করা দরকার তারা আপনার উত্তরটি পড়ার দ্বারা উপকৃত হবেন।
বিস্মিত

একে অপরের কল যে একজোড়া ফাংশন সম্পর্কে। কোনও শর্ত পৌঁছানো পর্যন্ত একটি কল বি কলকে আবার কল করে। এটি কি পুনরাবৃত্তি হিসাবে বিবেচিত হবে?
সান্টিয়াগোস্কি

হ্যাঁ, ফাংশনটি aএখনও নিজেকে অপ্রত্যক্ষভাবে (ডেকে b) কল করে ।
21-22

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

21

রিকার্সিভ প্রোগ্রামিং হ'ল ক্রমবর্ধমানভাবে নিজের সংস্করণগুলি সমাধান করার জন্য কোনও সমস্যা হ্রাস করার প্রক্রিয়া।

প্রতিটি পুনরাবৃত্তি ফাংশন প্রবণতা:

  1. প্রক্রিয়া করার জন্য একটি তালিকা নিন, বা অন্য কোনও কাঠামো, বা সমস্যা ডোমেন
  2. বর্তমান পয়েন্ট / পদক্ষেপের সাথে ডিল
  3. অবশিষ্ট (গুলি) / সাবডোমেন (গুলি) এ নিজেকে কল করুন
  4. সাবডোমেন কাজের ফলাফলগুলি একত্রিত বা ব্যবহার করুন

পদক্ষেপ 2 যখন 3 এর আগে হয় এবং 4 তম ধাপ যখন তুচ্ছ হয় (তখন একটি সমষ্টি, যোগফল বা কিছুই হয় না) এটি পুচ্ছ পুনরাবৃত্তি সক্ষম করে । পদক্ষেপ 2 প্রায়শই পদক্ষেপ 3 পরে আসতে হবে, কারণ বর্তমান পদক্ষেপটি সম্পূর্ণ করার জন্য সমস্যার সাবডোমেন (গুলি) থেকে প্রাপ্ত ফলাফলের প্রয়োজন হতে পারে।

সোজা এগিয়ে বাইনারি গাছের ট্র্যাভারসাল নিন। ট্র্যাভারসাল কী প্রয়োজন তা নির্ভর করে প্রি-অর্ডার, ইন-অর্ডার বা পোস্ট-অর্ডারে তৈরি করা যেতে পারে।

   B
A     C

প্রাক অর্ডার: বিএসি

traverse(tree):
    visit the node
    traverse(left)
    traverse(right)

অর্ডার: এবিসি

traverse(tree):
    traverse(left)
    visit the node
    traverse(right)

পোস্ট-অর্ডার: এসিবি

traverse(tree):
    traverse(left)
    traverse(right)
    visit the node

অনেকগুলি পুনরাবৃত্ত সমস্যাগুলি মানচিত্রের ক্রিয়াকলাপের নির্দিষ্ট ক্ষেত্রে বা একটি ভাঁজ - কেবলমাত্র এই দুটি ক্রিয়াকলাপ বোঝার ফলে পুনরাবৃত্তির জন্য ভাল ব্যবহারের ক্ষেত্রে তাত্পর্যপূর্ণ বোঝার কারণ হতে পারে।


ব্যবহারিক পুনরাবৃত্তির মূল উপাদানটি হ'ল বড়টিকে সমাধান করার জন্য কিছুটা ছোট সমস্যার সমাধান ব্যবহার করা। অন্যথায়, আপনার কেবল অসীম পুনরাবৃত্তি রয়েছে।
ব্যারি ব্রাউন

@ বেরি ব্রাউন: একদম ঠিক আছে। সুতরাং আমার বক্তব্য "... নিজেই সংস্করণগুলি সমাধান করা সহজতর করার জন্য সমস্যা হ্রাস"
অরব্লিং

আমি অগত্যা এটি বলব না ... এটি প্রায়শই ঘটে থাকে, বিশেষত বিভাজন এবং সমস্যাগুলি জয় করার ক্ষেত্রে বা এমন পরিস্থিতিতে যেখানে আপনি সত্যিকার অর্থে পুনরাবৃত্তির সম্পর্কটিকে সংজ্ঞায়িত করেন যা একটি সাধারণ ক্ষেত্রে আসে। তবে আমি বলব যে এটি আপনার সমস্যার প্রতিটি পুনরাবৃত্তির জন্য প্রমান করার বিষয়ে আরও বেশি, এন + 1 এর একটি
গণনাকারী

1
@ শিয়ান ম্যাকমিলান: পুনরাবৃত্তি একটি শক্তিশালী সরঞ্জাম যখন এটি ডোমেনগুলিতে ব্যবহার করা হয় যা এটি উপযুক্ত। সবসময়ই আমি দেখি এটি কিছু অপেক্ষাকৃত তুচ্ছ সমস্যা পরিচালনা করার জন্য একটি চতুর উপায় হিসাবে ব্যবহৃত হয়েছে, যা হাতের কাজটির প্রকৃত প্রকৃতিকে ব্যাপকভাবে উদ্বিগ্ন করে।

20

ওপি বলেছিল যে আসল বিশ্বে পুনরাবৃত্তির অস্তিত্ব নেই, তবে আমি আলাদা হতে অনুরোধ করছি।

আসুন পিজ্জা কাটার বাস্তব জগতের 'অপারেশন' নেওয়া যাক। আপনি চুলা থেকে পিজ্জা বের করেছেন এবং এটি পরিবেশন করার জন্য আপনাকে এটি অর্ধেক কেটে নিতে হবে, তারপরে সেই অর্ধেকটি কেটে ফেলতে হবে, তারপরে আবার সেই ফলাফলগুলি অর্ধেকে কেটে ফেলতে হবে।

আপনি যে ফলাফলটি চান তা না পাওয়া পর্যন্ত আপনি পিজ্জা কাটার ক্রিয়াকলাপটি বারবার সম্পাদন করছেন (টুকরো সংখ্যা)। এবং যুক্তিযুক্ত কারণে আমরা ধরা যাক যে একটি বিযুক্ত পিজ্জা নিজেই একটি স্লাইস।

এখানে রুবির একটি উদাহরণ রয়েছে:

ডিএফ কাট_পিজা (বিদ্যমান_স্লাইস, কাঙ্ক্ষিত_স্লাইস)
  যদি বিদ্যমান_ স্লাইস! = কাঙ্ক্ষিত_স্লাইস
    # আমাদের কাছে এখনও সবাইকে খাওয়ানোর মতো পর্যাপ্ত টুকরা নেই
    # আমরা পিজ্জার টুকরোগুলি কাটছি, এভাবে তাদের সংখ্যা দ্বিগুণ করুন
    new_slices = বিদ্যমান_ স্লাইস * 2 
    # এবং এটি এখানে পুনরাবৃত্তি কল
    কাট_পিজা (নতুন_স্লাইস, কাঙ্ক্ষিত_স্লাইস)
  আর
    # আমাদের কাঙ্ক্ষিত সংখ্যক টুকরো রয়েছে তাই আমরা ফিরে আসি
    # এখানে পুনরাবৃত্তি চালিয়ে যাওয়ার পরিবর্তে
    বিদ্যমান_স্লাইসগুলি ফেরত দিন
  শেষ
শেষ

পিজ্জা = 1 # পুরো পিজ্জা, 'এক স্লাইস'
কাট_পিজা (পিজ্জা, 8) # => আমরা 8 পেয়ে যাব

সুতরাং আসল ওয়ার্ল্ড অপারেশনটি পিজ্জা কাটছে এবং পুনরাবৃত্তি একই জিনিসটি বার বার করে চলেছে যতক্ষণ না আপনি যা চান তা না করেন।

অপারেশনসগুলি আপনি সেই ক্রপটিকে খুঁজে পাবেন যা আপনি পুনরাবৃত্ত ফাংশনগুলির সাথে প্রয়োগ করতে পারবেন:

  • কয়েক মাস ধরে যৌগিক সুদের গণনা করা হচ্ছে।
  • একটি ফাইল সিস্টেমে একটি ফাইল সন্ধান করা (কারণ ডিরেক্টরিগুলির কারণে ফাইল সিস্টেম গাছ হয়)।
  • সাধারণত গাছের সাথে কাজ করার সাথে যে কোনও কিছু জড়িত, আমার ধারণা।

আমি এর ফাইলের নামের উপর ভিত্তি করে কোনও ফাইল সন্ধান করার জন্য একটি প্রোগ্রাম লেখার পরামর্শ দিচ্ছি এবং এমন একটি ফাংশন লিখার চেষ্টা করব যা এটি না পাওয়া পর্যন্ত নিজেকে কল করে, স্বাক্ষরটি দেখতে দেখতে এই রকম হবে:

find_file_by_name(file_name_we_are_looking_for, path_to_look_in)

সুতরাং আপনি এটিকে এটি কল করতে পারেন:

find_file_by_name('httpd.conf', '/etc') # damn it i can never find apache's conf

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

অতিরিক্ত ক্রেডিটcut_pizza উদাহরণটি যদি আপনি এটি টুকরা একটি সংখ্যা জন্য আপনাকে বলব একটি স্ট্যাক স্তর খুব গভীরে ত্রুটি দেব যে 2 (অর্থাত 2 বা 4 বা 8 বা 16) একটি ক্ষমতা নয়। আপনি কি এটিকে সংশোধন করতে পারেন যাতে কেউ যদি 10 টি টুকরো জিজ্ঞাসা করে তবে তা চিরকালের জন্য চালিত হবে না?


16

ঠিক আছে আমি এই সহজ এবং সংক্ষিপ্ত রাখার চেষ্টা করতে যাচ্ছি।

রিকার্সিভ ফাংশন হ'ল ফাংশন যা তাদের কল করে। রিকার্সিভ ফাংশনটিতে তিনটি জিনিস রয়েছে:

  1. যুক্তিবিদ্যা
  2. নিজেই একটি কল
  3. কখন শেষ করতে হবে।

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

যেহেতু এটি প্রোগ্রামার ওয়েবসাইট তাই আমি কোড লেখা থেকে বিরত থাকব তবে এখানে একটি ভাল লিঙ্ক

যদি আপনি সেই রসিকতা পেয়ে থাকেন তবে পুনরাবৃত্তির অর্থ কী।



4
কঠোরভাবে, পুনরাবৃত্তি একটি সমাপ্তির শর্ত প্রয়োজন হয় না; গ্যারান্টি দিয়ে যে পুনরাবৃত্তি সমাপ্ত করে যা পুনরাবৃত্তির ক্রিয়াটি সমাধান করতে পারে এমন ধরণের সমস্যাগুলিকে সীমাবদ্ধ করে এবং এমন কিছু শব্দার্থক উপস্থাপনা রয়েছে যা একেবারে সমাপ্তির প্রয়োজন হয় না।
ডোনাল ফেলো

6

পুনরাবৃত্তি এমন একটি সরঞ্জাম যা কোনও প্রোগ্রামার নিজেই একটি ফাংশন কল শুরু করতে ব্যবহার করতে পারে। ফিবোনাচি সিক্যুয়েন্সটি পুনরাবৃত্তি কীভাবে ব্যবহৃত হয় তার পাঠ্যপুস্তকের উদাহরণ।

সর্বাধিক পুনরাবৃত্ত কোড যদি সমস্ত পুনরাবৃত্ত ফাংশন হিসাবে প্রকাশ করা না যায় তবে এটি সাধারণত অগোছালো। অন্যান্য পুনরাবৃত্তিমূলক প্রোগ্রামগুলির ভাল উদাহরণ হ'ল ডেটা স্ট্রাকচার যেমন গাছ, বাইনারি অনুসন্ধান ট্রি এবং এমনকি কোউকোর্ট।

পুনরাবৃত্তি কোডটি কম আস্তে তৈরি করতে ব্যবহৃত হয়, মনে রাখবেন এটি সাধারণত ধীর হয় এবং আরও মেমরির প্রয়োজন হয়।


এটি ধীর গতিতে বা বেশি মেমরির প্রয়োজন কিনা তা হাতের ব্যবহারের উপর নির্ভর করে।
অর্বলিং

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

1
@ ডেভ: আমি এ নিয়ে বিরোধ করব না, তবে আমি মনে করি ফিবোনাচি শুরু করার পক্ষে একটি ভাল উদাহরণ।
ব্রায়ান হ্যারিংটন

5

আমি এটি ব্যবহার করতে চাই:

আপনি কিভাবে দোকানে হাঁটবেন?

আপনি যদি স্টোরের প্রবেশপথে থাকেন তবে কেবল এটির মধ্য দিয়ে যান। অন্যথায়, এক পদক্ষেপ নিন, তারপরে স্টোরের বাকী রাস্তাটি হাঁটুন।

এটি তিনটি দিক অন্তর্ভুক্ত করা সমালোচনা:

  • একটি তুচ্ছ বেস কেস
  • সমস্যার একটি ছোট অংশ সমাধান করা
  • বাকী সমস্যাটি পুনরাবৃত্তভাবে সমাধান করা

আমরা আসলে দৈনন্দিন জীবনে প্রচুর পরিমাণে পুনরাবৃত্তি ব্যবহার করি; আমরা কেবল এটি সেভাবে ভাবি না।


এটি পুনরাবৃত্তি নয়। এটি যদি আপনি এটি দুটি ভাগে বিভক্ত হন: স্টোরের অর্ধেক পথ হাঁটা, অন্য অর্ধেক হাঁটা walk Recurse।

2
এটি পুনরাবৃত্তি। এটি বিভাজন এবং বিজয় নয়, তবে এটি কেবল এক ধরণের পুনরাবৃত্তি। গ্রাফ অ্যালগরিদমগুলি (পাথ সন্ধানের মতো) পুনরাবৃত্ত ধারণার সাথে পূর্ণ।
ডেডালনিক্স

2
এটি পুনরাবৃত্তি, তবে আমি এটি একটি দুর্বল উদাহরণ হিসাবে বিবেচনা করি, কারণ মানসিকভাবে "এক পদক্ষেপ গ্রহণ করুন, তারপরে স্টোরের বাকী অংশে হাঁটুন" পুনরুক্তিযোগ্য অ্যালগরিদমের অনুবাদ করা খুব সহজ। আমি মনে করি এটি একটি সুন্দর লিখিত forলুপকে একটি অর্থহীন পুনরাবৃত্তির ক্রিয়ায় রূপান্তর করার সমান ।
ব্রায়ান

3

আমি আপনাকে যে সর্বোত্তম উদাহরণটি নির্দেশ করতে চাই তা হল কে ও আর-র সি প্রোগ্রামিং ল্যাঙ্গুয়েজ that বইটিতে (এবং আমি স্মৃতি থেকে উদ্ধৃতি দিচ্ছি), পুনরাবৃত্তির জন্য সূচী পৃষ্ঠায় প্রবেশের (একা) প্রকৃত পৃষ্ঠাটি তালিকাভুক্ত করা হয়েছে যেখানে তারা পুনরাবৃত্তি সম্পর্কে কথা বলে এবং সূচক পৃষ্ঠাও।


2

জোশ কে ইতিমধ্যে মাত্রোশকা পুতুলের কথা উল্লেখ করেছেন । ধরে নিন যে আপনি এমন কিছু শিখতে চান যা কেবলমাত্র সবচেয়ে ছোট পুতুলই জানে। সমস্যা হল আপনি কি সত্যিই সরাসরি তাকে কথা বলতে পারেন না কারণ তিনি মূলত বেঁচে থাকে ভিতরে লম্বা পুতুল যা প্রথম ছবি উপর তার বাম দিকে স্থাপন করা হয়। এই কাঠামোটি এর মতো চলে যায় (একটি পুতুল লম্বা পুতুলের অভ্যন্তরে থাকে) কেবলমাত্র দীর্ঘতম একের সাথে শেষ না হওয়া পর্যন্ত।

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

এটিই পুনরাবৃত্তি সত্যই করে। প্রত্যাশিত উত্তর না পাওয়া পর্যন্ত কোনও ফাংশন / পদ্ধতি নিজেকে কল করে। এ কারণেই যখন আপনি পুনরাবৃত্ত কোড লিখবেন তখন কখন পুনরাবৃত্তি সমাপ্ত হবে সে সম্পর্কে সিদ্ধান্ত নেওয়া খুব গুরুত্বপূর্ণ।

সেরা ব্যাখ্যা নয় তবে এটি আশাবাদী সাহায্য করবে।


2

পুনরাবৃত্তি n। - অ্যালগরিদম ডিজাইনের একটি প্যাটার্ন যেখানে কোনও ক্রিয়াকলাপ নিজের শর্ত অনুযায়ী সংজ্ঞায়িত করা হয়।

ক্লাসিক উদাহরণটি একটি সংখ্যার ফ্যাক্টরিয়াল সন্ধান করছে, এন! 0! = 1 এবং অন্য যে কোনও প্রাকৃতিক সংখ্যা N এর জন্য N এর ফ্যাক্টরিয়াল হ'ল সমস্ত প্রাকৃতিক সংখ্যার N এর চেয়ে কম বা সমান So সুতরাং, 6! = 6 * 5 * 4 * 3 * 2 * 1 = 720. এই প্রাথমিক সংজ্ঞাটি আপনাকে একটি সাধারণ পুনরাবৃত্তি সমাধান তৈরি করতে দেয়:

int Fact(int degree)
{
    int result = 1;
    for(int i=degree; i>1; i--)
       result *= i;

    return result;
}

তবে, আবার অপারেশন পরীক্ষা করুন। 6! = 6 * 5 * 4 * 3 * 2 * 1। একই সংজ্ঞা দিয়ে, 5! = 5 * 4 * 3 * 2 * 1, এর অর্থ আমরা 6 বলতে পারি! = 6 * (5!)। ঘুরে, 5! = 5 * (4!) এবং আরও। এটি করার মাধ্যমে, আমরা পূর্ববর্তী সমস্ত ক্রিয়াকলাপগুলির ফলাফল হিসাবে সম্পাদিত একটি অপারেশনে সমস্যা হ্রাস করি। এটি শেষ পর্যন্ত এমন একটি বিন্দুতে হ্রাস পায়, যাকে বেস কেস বলা হয়, যেখানে ফলাফল সংজ্ঞা দ্বারা জানা যায়। আমাদের ক্ষেত্রে, 0! = 1 (আমরা বেশিরভাগ ক্ষেত্রে এটিও বলতে পারি যে 1! = 1)। কম্পিউটিংয়ে, আমাদের প্রায়শই একটি খুব অনুরূপ পদ্ধতিতে অ্যালগরিদমগুলি সংজ্ঞায়িত করার অনুমতি দেওয়া হয়, পদ্ধতিটি নিজে কল করে এবং একটি ছোট ইনপুট পাস করে, ফলে অনেকগুলি পুনরাবৃত্তির মাধ্যমে বেস কেসটিতে সমস্যা হ্রাস করে:

int Fact(int degree)
{
    if(degree==0) return 1; //the base case; 0! = 1 by definition
    else return degree * Fact(degree -1); //the recursive case; N! = N*(N-1)!
}

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

int Fact(int degree)
{
    //reads equivalently to the above, but is concise and often optimizable
    return degree==0 ? 1: degree * Fact(degree -1);
}

সুবিধাদি:

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

অসুবিধা:

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

1

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

আপনি ভাবতে পারেন যে বাস্তব জীবনে কখনই ঘটে না, তবে কোনও নির্দিষ্ট সংস্থা বা বিভাগের লোকদের গণনা করার বা তাদের বেতন যোগ করার চেষ্টা করার কল্পনা করুন, যার মধ্যে এমন লোকের সংমিশ্রণ রয়েছে যারা কেবল সংস্থার জন্য কাজ করেন, বিভাগে থাকেন, তারপরে বিভাগগুলি আছে ইত্যাদি on বা এমন একটি অঞ্চলে বিক্রয় রয়েছে যার কয়েকটি অঞ্চলে রয়েছে, যার মধ্যে কিছুতে শহরতলির আওতা রয়েছে etc. ইত্যাদি These ব্যবসায়ের ক্ষেত্রে এই ধরণের সমস্যা সর্বদা ঘটে।


0

পুনরাবৃত্তি গণনা প্রচুর সমস্যা সমাধান করতে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, বলুন যে আপনার একটি পার্টিতে এন গ্রুপের একটি গ্রুপ রয়েছে (n> 1), এবং প্রত্যেকে একবারে অন্য সবার হাত ঠিকঠাক করে। কয়টি হ্যান্ডশেক হয়? আপনি হয়ত জানেন যে সমাধানটি সি (এন, 2) = এন (এন -1) / 2, তবে আপনি নিম্নলিখিত হিসাবে পুনরাবৃত্তভাবে সমাধান করতে পারেন:

মনে করুন মাত্র দু'জন লোক আছেন। তারপরে (পরিদর্শন করে) উত্তরটি স্পষ্টতই 1।

মনে করুন আপনার তিনজন লোক আছে। এক ব্যক্তিকে একা করুন এবং নোট করুন যে তিনি / তিনি অন্য দু'জনের সাথে হাত মিলিয়েছেন। এর পরে আপনাকে অন্য দু'জনের মধ্যে কেবল হাতের মুঠোয় গণনা করতে হবে। আমরা ইতিমধ্যে এটি এখনই করেছি, এবং এটি 1। সুতরাং উত্তরটি 2 + 1 = 3।

ধরুন আপনার কাছে n লোক আছে। আগের মতো একই যুক্তি অনুসরণ করে, এটি (এন -1) + (এন -1 জনের মধ্যে হ্যান্ডশেকের সংখ্যা)। প্রসারিত হচ্ছে, আমরা (এন -1) + (এন -2) + ... + 1 পেয়েছি।

পুনরাবৃত্তির কাজ হিসাবে প্রকাশ করা,

f (2) = 1
f (n) = n-1 + f (n-1), n> 2


0

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

যদিও এখানে বিশ্বে পুনরাবৃত্তি ঘটে। অনেক.

একটি ভাল উদাহরণ জলচক্র (এর একটি সরল সংস্করণ):

  • রোদ হ্রদ উত্তপ্ত
  • জল আকাশে উঠে মেঘের রূপ দেয়
  • মেঘগুলি একটি পাহাড়ে প্রবাহিত হয়
  • পাহাড়ে বাতাস খুব শীতল হয়ে যায় যাতে তাদের আর্দ্রতা ধরে রাখা যায় না
  • বৃষ্টি পরে
  • একটি নদী গঠন
  • নদীর জল হ্রদে চলে যায়

এটি এমন একটি চক্র যার ফলে এটি আবার ঘটে। এটি পুনরাবৃত্ত হয়।

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

স্টিভেন পিংকার এর ভাষা প্রবৃত্তি থেকে:

যদি হয় মেয়েটি আইসক্রিম খায় বা মেয়েটি মিছরি খায় তবে ছেলেটি গরম কুকুর খায়

এটি একটি সম্পূর্ণ বাক্য যাতে অন্যান্য সম্পূর্ণ বাক্য থাকে:

মেয়েটি আইসক্রিম খায়

মেয়েটি মিছরি খায়

ছেলেটি গরম কুকুর খায়

সম্পূর্ণ বাক্যটি বোঝার কাজটির মধ্যে ছোট ছোট বাক্যগুলি বোঝা জড়িত, যা একই বাক্যটিকে সম্পূর্ণ বাক্য হিসাবে বোঝার জন্য মানসিক কৌশলগুলি ব্যবহার করে।

প্রোগ্রামিং দৃষ্টিকোণ থেকে পুনরাবৃত্তি বোঝার জন্য পুনরাবৃত্তি দিয়ে সমাধান করা যেতে পারে এমন কোনও সমস্যার দিকে নজর দেওয়া সহজ, এবং কেন এটি হওয়া উচিত এবং এর অর্থ আপনার কী করতে হবে তা বোঝা।

উদাহরণস্বরূপ আমি সবচেয়ে বড় সাধারণ বিভাজক ফাংশনটি ব্যবহার করব বা সংক্ষেপে জিসিডি করব।

আপনার দুটি নম্বর আছে aএবং b। তাদের জিসিডি খুঁজে পেতে (ধরে নিচ্ছেন না যে 0 হয়) আপনার aসমানভাবে বিভাজ্য কিনা তা পরীক্ষা করে দেখতে হবে b। যদি তা হয় তবে bসিসিডি, অন্যথায় আপনাকে জিসিডি bএবং এর বাকী অংশগুলি পরীক্ষা করা দরকার a/b

আপনি ইতিমধ্যে দেখতে সক্ষম হবেন যে এটি একটি পুনরাবৃত্ত ফাংশন, আপনার যেমন জিসিডি ফাংশনটি জিসিডি ফাংশনটি কল করে। এটি কেবল ঘরে আটকা দেওয়ার জন্য, এখানে এটি সি # তে রয়েছে (আবার ধরে নেওয়া, 0 কখনই প্যারামিটার হিসাবে পাস হয় না):

int gcd(int a, int b)
{   
    if (a % b == 0) //this is a stopping condition
    {
        return b;
    }

    return (gcd(b, a % b)); //the call to gcd here makes this function recursive
}

একটি প্রোগ্রামে, থামার অবস্থা থাকা জরুরী, অন্যথায় আপনি ফাংশনটি চিরতরে পুনরাবৃত্তি হবে, যা শেষ পর্যন্ত স্ট্যাকের ওভারফ্লোতে কারণ হয়ে উঠবে!

কিছুক্ষণ লুপ বা অন্য কিছু পুনরাবৃত্তি নির্মাণের পরিবর্তে এখানে পুনরাবৃত্তি ব্যবহার করার কারণটি হ'ল আপনি কোডটি পড়ার সাথে সাথে এটি আপনাকে কী করছে এবং এর পরে কী ঘটবে তা জানিয়ে দেয়, সুতরাং এটি সঠিকভাবে কাজ করছে কিনা তা নির্ধারণ করা সহজ is ।


1
আমি জলচক্র উদাহরণ পুনরাবৃত্তির খুঁজে পেয়েছি। দ্বিতীয় ভাষা-উদাহরণটি পুনরাবৃত্তির চেয়ে বিভাজন এবং বিজয় বলে মনে হয়।
গুলশান

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

জলচক্রটিতে, চক্রটি সূর্যের দ্বারা শুরু হয় এবং চক্রের অন্য কোনও উপাদান সূর্যটিকে আবার শুরু করে না। তো, পুনরাবৃত্তি কলটি কোথায়?
গুলশান

কোন পুনরাবৃত্তি কল নেই! কোন ফাংশন নয়। : ডি এটি পুনরাবৃত্ত কারণ এটি তার স্ব পুনরুত্থান কারণ। হ্রদ থেকে জল আবার হ্রদে ফিরে আসে এবং চক্রটি আবার শুরু হয়। যদি অন্য কোনও সিস্টেম হ্রদে পানি wasুকিয়ে দেয় তবে তা পুনরুক্তিযোগ্য হবে।
ম্যাট এলেন

1
জলচক্রটি একটি লুপ হয়। অবশ্যই, পুনরূদ্ধার ব্যবহার করে কিছুক্ষণ লুপ প্রকাশ করা যেতে পারে তবে এটি করলে স্ট্যাকটি ফুঁকবে। দয়া করে না।
ব্রায়ান

0

পুনরাবৃত্তি জন্য এখানে একটি বাস্তব বিশ্বের উদাহরণ।

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

এখন তাদের এই ম্যানুয়ালটির সাহায্যে কমিক্সের এই বড় অরসোর্টার্ড গাদাটি বাছাই করুন:

Manual: How to sort a pile of comics

Check the pile if it is already sorted. If it is, then done.

As long as there are comics in the pile, put each one on another pile, 
ordered from left to right in ascending order:

    If your current pile contains different comics, pile them by comic.
    If not and your current pile contains different years, pile them by year.
    If not and your current pile contains different tenth digits, pile them 
    by this digit: Issue 1 to 9, 10 to 19, and so on.
    If not then "pile" them by issue number.

Refer to the "Manual: How to sort a pile of comics" to separately sort each
of the new piles.

Collect the piles back to a big pile from left to right.

Done.

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

এটিই মূলত পুনরাবৃত্তি সম্পর্কে যা ঘটেছিল: খুব একই প্রক্রিয়া সম্পাদন করা, কেবল একটি সূক্ষ্ম বিশদ স্তরে আপনি এতে যত বেশি যান।


-1
  • প্রস্থান করার শর্ত পৌঁছে গেলে সমাপ্ত করুন
  • জিনিসের অবস্থা পরিবর্তন করতে কিছু করুন
  • কাজটি বর্তমান সময়ের অবস্থা দিয়ে শুরু করে করুন

পুনরাবৃত্তি এমন কিছু প্রকাশ করার জন্য একটি খুব সংক্ষিপ্ত উপায় যা কোনও কিছু না পৌঁছানো পর্যন্ত পুনরাবৃত্তি করতে হয়।



-2

পুনরাবৃত্তির একটি দুর্দান্ত ব্যাখ্যা হ'ল আক্ষরিক 'এমন ক্রিয়া যা নিজের মধ্যে থেকেই পুনরায় ফিরে আসে "।

কোনও চিত্রশিল্পী কোনও প্রাচীর আঁকার চিত্রটি বিবেচনা করুন, এটি পুনরাবৃত্ত কারণ কারণ ক্রিয়াটি "ডান থেকে কিছুটা স্কুটের চেয়ে ছাদ থেকে তল পর্যন্ত একটি স্ট্রিপ আঁকুন এবং (ডান দিকে স্কুটের চেয়ে ছাদ থেকে তল পর্যন্ত একটি স্ট্রিপ আঁকুন এবং চিত্র আঁকুন) ডানদিকে (এবং ইত্যাদি) স্কুটের চেয়ে ছাদ থেকে মেঝেতে ফালা দিন "

তার পেইন্ট () ফাংশনটি তার বড় পেইন্টওয়াল () ফাংশনটি তৈরি করতে বারবার কল করে।

আশা করি এই দরিদ্র চিত্রশিল্পীর একধরনের স্টপ অবস্থা রয়েছে :)


6
আমার কাছে উদাহরণটি পুনরাবৃত্তির মতো নয় বরং পুনরাবৃত্ত পদ্ধতির মতো মনে হয়।
গুলশান

@ গুলশান: পুনরাবৃত্তি এবং পুনরাবৃত্তি একই রকম কাজ করে এবং প্রায়শই জিনিসগুলি উভয়ের সাথে ভালভাবে কাজ করবে। কার্যকরী ভাষা সাধারণত পুনরাবৃত্তির পরিবর্তে পুনরাবৃত্তি ব্যবহার করে। পুনরাবৃত্তির আরও ভাল উদাহরণ রয়েছে যেখানে একই জিনিসটি পুনরাবৃত্তভাবে লিখতে অসুবিধে হবে।
ডেভিড থর্নলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.