পুনরাবৃত্তি বনাম পুনরাবৃত্তি


109

এটি কি ঠিক বলা যায় যে সমস্ত জায়গায় পুনরাবৃত্তি ব্যবহৃত হয় একটি forলুপ ব্যবহার করা যেতে পারে? এবং যদি পুনরাবৃত্তি সাধারণত ধীর হয় তবে এটি ব্যবহার করার প্রযুক্তিগত কারণ কীfor লুপ পুনরাবৃত্তির কী?

এবং যদি সর্বদা সম্ভব হয় কোনও পুনরাবৃত্তিকে একটি forলুপে রূপান্তর করা কি এটি করার কোনও থাম্ব উপায়ের নিয়ম রয়েছে?


3
recursionবনাম iteration? iteration = for loopআমি মনে করি.
গংজিটাওও

4
টম মোয়ার্টেলের ব্লগে পুনরাবৃত্ত কোডগুলি
cjohnson318

উত্তর:


146

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

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

পুনরাবৃত্তি ব্যবহারের প্রধান কারণগুলি

  • এটি সমস্যার ক্ষেত্রে আমাদের পদ্ধতির নকল করলে এটি অনেক ক্ষেত্রে আরও স্বজ্ঞাত
  • গাছের মতো কিছু ডেটা স্ট্রাকচার পুনরাবৃত্তি ব্যবহার করে অন্বেষণ করা সহজ (বা কোনও ক্ষেত্রে স্ট্যাকের প্রয়োজন হবে)

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


10
এটি যুক্ত করার জন্য - পুনরাবৃত্তি হ্রাসের শব্দটির সাথে ঘনিষ্ঠভাবে সম্পর্কিত যা বহু অ্যালগরিদমে এবং সাধারণভাবে সিএসে কেন্দ্রীয় ভূমিকা পালন করে।
সামউইউটি ইউজারনেম

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

একটি ফাংশন লিখুন @Yeikel f(n)যে n তম ফেরৎ ফিবানচি সংখ্যা
ম্যাট

54

এটি কি ঠিক বলা যায় যে সর্বত্র পুনরাবৃত্তি লুপের জন্য ব্যবহৃত হয়?

হ্যাঁ, কারণ বেশিরভাগ সিপিইউতে পুনরাবৃত্তি লুপ এবং স্ট্যাক ডেটা কাঠামোর সাথে মডেল করা হয়।

এবং যদি পুনরাবৃত্তি সাধারণত ধীর হয় তবে এটি ব্যবহারের প্রযুক্তিগত কারণ কী?

এটি "সাধারণত ধীর" নয়: এটি পুনরাবৃত্তি যা ভুলভাবে প্রয়োগ করা হয় এটি ধীর। তার উপরে, আধুনিক সংকলকরা কিছু জিজ্ঞাসা না করে কিছু পুনরাবৃত্তিকে লুপগুলিতে রূপান্তর করতেও বেশ ভাল।

এবং যদি সর্বদা সম্ভব হয় তবে কোনও পুনরাবৃত্তিকে একটি লুপের জন্য রূপান্তর করা কি এটি করার কোনও থাম্বের উপায় রয়েছে?

পুনরাবৃত্তভাবে ব্যাখ্যা করার সময় অ্যালগরিদমের জন্য পুনরাবৃত্তি প্রোগ্রাম লিখুন; অ্যালগরিদমগুলির জন্য পুনরাবৃত্তির প্রোগ্রামগুলি লিখুন পুনরাবৃত্তির সাথে ভালভাবে ব্যাখ্যা করা।

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


+ আমি ডিজকস্ট্রার "প্রোগ্রামিংয়ের শৃঙ্খলা" থেকে স্লেজহ্যামার উপমা orrowণ নিয়েছি।


7
পুনরাবৃত্তি সাধারণত স্ট্যাক ফ্রেম এবং এরকম তৈরির কারণে আরও ব্যয়বহুল (ধীর / আরও মেমরি) is পর্যাপ্ত জটিল সমস্যার জন্য সঠিকভাবে প্রয়োগ করার সময় পার্থক্যটি ছোট হতে পারে তবে এটি আরও ব্যয়বহুল। টেল রিকার্সন অপ্টিমাইজেশানের মতো সম্ভাব্য ব্যতিক্রম রয়েছে।
বার্নহার্ড বার্কার

আমি প্রতিটি ক্ষেত্রে লুপের জন্য নিশ্চিত নই । একক জটিল পরিবর্তনের চেয়ে আরও জটিল পুনরাবৃত্তি বা পুনরাবৃত্তি বিবেচনা করুন
সোমারউইটি ইউজারনেম

@ ডাসব্লিংকনলাইট একক একাধিক লুপ হ্রাস করা তাত্ত্বিকভাবেই সম্ভব হতে পারে তবে এ সম্পর্কে নিশ্চিত নন।
সামউইউটি ইউজারনেম

@ আইসপ্যাক হ্যাঁ, এটি সম্ভব। এটি সুন্দর নাও হতে পারে তবে এটি সম্ভব।
বার্নহার্ড বার্কার

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

28

প্রশ্ন:

এবং যদি পুনরাবৃত্তি সাধারণত ধীর হয় তবে লুপ পুনরাবৃত্তির জন্য এটি ব্যবহার করার প্রযুক্তিগত কারণ কী?

উত্তর :

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

আরেকটি ভাল জিনিস চেষ্টা করে দেখুন: পুনরায় বিভক্তকরণ মার্জ লেখার চেষ্টা করুন। এটি আপনাকে বেশ কিছুটা সময় নেবে।

প্রশ্ন:

এটি কি ঠিক বলা যায় যে সর্বত্র পুনরাবৃত্তি লুপের জন্য ব্যবহৃত হয়?

উত্তর :

হ্যাঁ. এই থ্রেডটির এটির জন্য খুব ভাল উত্তর রয়েছে।

প্রশ্ন:

এবং যদি সর্বদা সম্ভব হয় তবে কোনও পুনরাবৃত্তিকে একটি লুপের জন্য রূপান্তর করা কি এটি করার কোনও থাম্বের উপায় রয়েছে?

উত্তর :

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

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


3
আমি একটি অনুমোদনমূলক উত্তর প্রদানের প্রয়াসকে প্রশংসা করি এবং আমি নিশ্চিত যে লেখক বুদ্ধিমান কিন্তু "আমার উপর আস্থা রাখুন" এমন অর্থবহ প্রশ্নের পক্ষে সহায়ক প্রতিক্রিয়া নয়, যার উত্তর অবিলম্বে সুস্পষ্ট নয়। পুনরাবৃত্তি গভীরতার-প্রথম অনুসন্ধান করার জন্য খুব সোজা সোজা অ্যালগরিদম রয়েছে। সিউডোকোডে একটি অ্যালগরিদমের বিবরণের জন্য এই পৃষ্ঠার নীচের উদাহরণটি দেখুন: csl.mtu.edu/cs2321/www/newLectures/26_Depth_First_Search.html
jdelman

3

ধীরে ধীরে হওয়া ছাড়াও, পুনরাবৃত্তির ফলে এটি কত গভীর হয় তার উপর নির্ভর করে স্ট্যাক ওভারফ্লো ত্রুটিগুলিও ঘটতে পারে।


3

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

উদাহরণস্বরূপ, ত্রিভুজাকার অনুক্রমের নবম ত্রিভুজাকার সংখ্যাটি সন্ধান করতে: 1 3 6 10 15… এমন একটি প্রোগ্রাম যা n ত্রি ত্রিভুজাকার সংখ্যাটি খুঁজে পেতে পুনরাবৃত্ত অ্যালগরিদম ব্যবহার করে:

একটি পুনরাবৃত্ত অ্যালগরিদম ব্যবহার:

//Triangular.java
import java.util.*;
class Triangular {
   public static int iterativeTriangular(int n) {
      int sum = 0;
      for (int i = 1; i <= n; i ++)
         sum += i;
      return sum;
   }
   public static void main(String args[]) {
      Scanner stdin = new Scanner(System.in);
      System.out.print("Please enter a number: ");
      int n = stdin.nextInt();
      System.out.println("The " + n + "-th triangular number is: " + 
                            iterativeTriangular(n));
   }
}//enter code here

একটি পুনরাবৃত্তির অ্যালগরিদম ব্যবহার:

//Triangular.java
import java.util.*;
class Triangular {
   public static int recursiveTriangular(int n) {
      if (n == 1)
     return 1;  
      return recursiveTriangular(n-1) + n; 
   }

   public static void main(String args[]) {
      Scanner stdin = new Scanner(System.in);
      System.out.print("Please enter a number: ");
      int n = stdin.nextInt();
      System.out.println("The " + n + "-th triangular number is: " + 
                             recursiveTriangular(n)); 
   }
}

1

বেশিরভাগ উত্তর মনে হয় যে iterative= for loop। যদি আপনার জন্য লুপটি নিয়ন্ত্রিত না হয় ( একটি লা সি, আপনি আপনার লুপের কাউন্টার দিয়ে যা খুশি করতে পারেন), তবে এটি সঠিক। যদি এটি একটি আসল for লুপ হয় (পাইথন বা বেশিরভাগ কার্যকরী ভাষায় যেমন আপনি লুপের কাউন্টারটিকে ম্যানুয়ালি সংশোধন করতে পারবেন না) বলুন তবে তা হয় না সঠিক ।

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

সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হ'ল প্রচুর ফাংশন পুনরাবৃত্তির সাথে কার্যকর করা খুব সহজ এবং পুনরাবৃত্তভাবে কার্যকর করা অত্যন্ত ভয়ঙ্করভাবে কঠিন (ম্যানুয়ালি আপনার কল স্ট্যাক পরিচালনা করা গণনা করে না)।


1

হ্যাঁ, বলেন দ্বারা Thanakron Tandavas ,

বিভাজন এবং বিজয়ী কৌশল দ্বারা সমাধান করা যেতে পারে এমন কোনও সমস্যা সমাধানের সময় পুনরাবৃত্তি ভাল।

উদাহরণস্বরূপ: হ্যানয়ের টাওয়ার

  1. এন ক্রমবর্ধমান আকারে রিং
  2. 3 খুঁটি
  3. রিংটি মেরুতে স্ট্যাক করা শুরু হয় 1.
    • একবারে কেবল একটি রিং স্থানান্তর করতে পারে।
    • ছোটের উপরে আরও বড় রিং লাগাতে পারে না।
  4. আইট্রেটিভ সমাধানটি "শক্তিশালী তবু কুৎসিত"; পুনরাবৃত্তির সমাধান হ'ল "মার্জিত"।

একটি আকর্ষণীয় উদাহরণ। আমি অনুমান করি যে আপনি এমসি এর দ্বারা কাগজটি জানেন "হোনয় এবং বাইনারি সংখ্যার টাওয়ারস"। 3brown1blue দ্বারা একটি দুর্দান্ত ভিডিওতেও চিকিত্সা করা হয়েছে।
অ্যান্ড্রেস্টান্দের

0

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

তবে আরও উন্নত পুনরাবৃত্ত সমাধানগুলির ক্ষেত্রে, আমি বিশ্বাস করি না যে এটি সর্বদা একটি সাধারণ forলুপ ব্যবহার করে এগুলি প্রয়োগ করতে সক্ষম হবে ।


পুনরাবৃত্ত আলগোরিদিমকে পুনরাবৃত্ত একটিতে (স্ট্যাক ব্যবহার করে) রূপান্তর করা সর্বদা সম্ভব। আপনি সম্ভবত একটি সাধারণ লুপ দিয়ে শেষ নাও করতে পারেন, তবে এটি সম্ভব।
বার্নহার্ড বার্কার

-4

পুনরাবৃত্তি + মুখস্তকরণ একটি খাঁটি পুনরাবৃত্ত পদ্ধতির সাথে তুলনা করে আরও কার্যকর সমাধানের দিকে নিয়ে যেতে পারে, উদাহরণস্বরূপ এটি পরীক্ষা করুন: http://jsperf.com/fibonacci-memoized-vs-iterative-for-large-n


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

-6

সংক্ষিপ্ত উত্তর: বাণিজ্য বন্ধ পুনরাবৃত্তি দ্রুত এবং প্রায় সব ক্ষেত্রে লুপগুলি কম স্মৃতি গ্রহণ করে। তবে এটিকে দ্রুত চালিত করার জন্য সাধারণত লুপ বা পুনরাবৃত্তি পরিবর্তন করার উপায় রয়েছে

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