পুনরাবৃত্তি বোঝা [বন্ধ]


225

স্কুলে পুনরাবৃত্তি বুঝতে আমার বড় সমস্যা হচ্ছে । যখনই অধ্যাপক এটি সম্পর্কে কথা বলছেন, আমি এটি পেয়েছি বলে মনে হচ্ছে তবে আমি নিজেই চেষ্টা করার সাথে সাথে এটি আমার মস্তিষ্ককে পুরোপুরি উড়িয়ে দেয়।

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


200
পুনরাবৃত্তি বোঝার জন্য, আপনাকে প্রথমে পুনরাবৃত্তি বুঝতে হবে।
পল টমলিন

40
পুনরাবৃত্তি: পুনরাবৃত্তি দেখুন
লরেন পেচটেল

36
@ পল: আমি রসিকতাটি পেয়েছি তবে আমি সবসময় ভেবেছিলাম এটি প্রযুক্তিগতভাবে ভুল is অ্যালগরিদম শেষ হওয়ার কারণ ভিত্তি শর্তটি কোথায়? এটি পুনরাবৃত্তি জন্য একটি মৌলিক প্রয়োজনীয়। =)
সেরজিও আকোস্টা

70
আমি এটিকে একটি শট দেব: "পুনরাবৃত্তি বুঝতে আপনার পুনরাবৃত্তি বুঝতে হবে, যতক্ষণ না আপনি এটি বোঝে।" =)
সেরজিও আকোস্টা

91
এই প্রশ্নের এটা সাহায্য করতে পারে কটাক্ষপাত আছে stackoverflow.com/questions/717725/understanding-recursion
ওমর Kooheji

উত্তর:


597

আপনি পাঁচটি ফুলযুক্ত একটি দানিটি কীভাবে খালি করবেন?

উত্তর: ফুলদানিটি খালি না থাকলে আপনি একটি ফুল বের করেন এবং তারপরে আপনি চারটি ফুলযুক্ত একটি ফুলদানি খালি করুন।

আপনি কীভাবে চারটি ফুলযুক্ত একটি ফুলদানি খালি করবেন?

উত্তর: ফুলদানিটি খালি না থাকলে আপনি একটি ফুল বের করেন এবং তারপরে আপনি তিনটি ফুলযুক্ত একটি ফুলদানি খালি করুন।

তিনটি ফুল সম্বলিত ফুলদানিটি কীভাবে খালি করবেন?

উত্তর: ফুলদানিটি খালি না থাকলে আপনি একটি ফুল বের করেন এবং তারপরে আপনি দুটি ফুলযুক্ত একটি ফুলদানি খালি করুন।

আপনি দুটি ফুলযুক্ত একটি দানিটি কীভাবে খালি করবেন?

উত্তর: ফুলদানিটি খালি না হলে আপনি একটি ফুল বের করেন এবং তারপরে আপনি একটি ফুলের একটি দানি খালি করেন।

আপনি কীভাবে একটি ফুলের ফুলদানি খালি করবেন?

উত্তর: ফুলদানিটি খালি না থাকলে আপনি একটি ফুল বের করেন এবং তারপরে কোনও ফুল নেই এমন ফুলদানি খালি করুন।

ফুল নেই এমন ফুলদানিটি কীভাবে খালি করবেন?

উত্তর: ফুলদানিটি খালি না থাকলে আপনি একটি ফুল বের করেন তবে ফুলদানি খালি তাই আপনার কাজ শেষ।

এটা পুনরাবৃত্তি। আসুন এটি সাধারণীকরণ করুন:

কীভাবে আপনি এন সহ একটি দানি খালি করবেন ?

উত্তর: যদি ফুলদানিটি খালি না থাকে তবে আপনি একটি ফুল বের করেন এবং তারপরে আপনি এন -1যুক্ত একটি ফুলদানি খালি করুন

হুম, আমরা কি কোডটিতে দেখতে পারি?

void emptyVase( int flowersInVase ) {
  if( flowersInVase > 0 ) {
   // take one flower and
    emptyVase( flowersInVase - 1 ) ;

  } else {
   // the vase is empty, nothing to do
  }
}

হুম, আমরা কি কেবল লুপের জন্য এটি করতে পারি না?

কেন, হ্যাঁ, পুনরাবৃত্তি পুনরাবৃত্তির সাথে প্রতিস্থাপন করা যেতে পারে, তবে প্রায়শই পুনরাবৃত্তি আরও মার্জিত হয়।

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

কল্পনা করুন যে একটি নোড, তার শিশুদের পাশাপাশি, একটি মান, একটি সংখ্যা আছে এবং কল্পনা করুন যে আমরা কিছু গাছের সমস্ত মান যোগ করতে চাই।

যে কোনও একটি নোডের মান যোগ করতে, আমরা নোডের মানটি তার বাম সন্তানের মান, যদি কোনও হয় এবং তার ডান সন্তানের মান, যদি কোনও যোগ করে দেব। এখন মনে রাখবেন যে বাচ্চারা, যদি তারা শূন্য না হয় তবে তারা নোডও।

বাম সন্তানের যোগফলের জন্য, আমরা চাইল্ড নোডের মানটি তার বাম সন্তানের মান, যদি কোনও হয় এবং তার ডান সন্তানের মান, যদি কোনও যোগ করে দেব।

সুতরাং বাম সন্তানের বাম সন্তানের মানটি যোগ করতে, আমরা চাইল্ড নোডের মানটি তার বাম সন্তানের মান, যদি কোনও হয় এবং তার ডান সন্তানের মান, যদি কোনও যোগ করে দেব।

সম্ভবত আপনি অনুমান করেছেন যে আমি এই সাথে কোথায় যাচ্ছি, এবং কিছু কোড দেখতে চান? ঠিক আছে:

struct node {
  node* left;
  node* right;
  int value;
} ;

int sumNode( node* root ) {
  // if there is no tree, its sum is zero
  if( root == null ) {
    return 0 ;

  } else { // there is a tree
    return root->value + sumNode( root->left ) + sumNode( root->right ) ;
  }
}

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

সুতরাং বলুন আমাদের কাছে এমন একটি গাছ রয়েছে যা দেখতে দেখতে (সংখ্যাগুলি মানগুলি হয়, স্ল্যাশগুলি শিশুদের দিকে নির্দেশ করে এবং @ এর অর্থ পয়েন্টারটি নালার দিকে নির্দেশ করে):

     5
    / \
   4   3
  /\   /\
 2  1 @  @
/\  /\
@@  @@

আমরা যদি রুটটিতে SumNode কল করি (মান 5 সহ নোড), আমরা ফিরে আসব:

return root->value + sumNode( root->left ) + sumNode( root->right ) ;
return 5 + sumNode( node-with-value-4 ) + sumNode( node-with-value-3 ) ;

এটি জায়গায় প্রসারিত করা যাক। আমরা যেখানেই SumNode দেখতে পাচ্ছি, আমরা এটিকে রিটার্নের স্টেটমেন্টের প্রসারণের সাথে প্রতিস্থাপন করব:

sumNode( node-with-value-5);
return root->value + sumNode( root->left ) + sumNode( root->right ) ;
return 5 + sumNode( node-with-value-4 ) + sumNode( node-with-value-3 ) ;

return 5 + 4 + sumNode( node-with-value-2 ) + sumNode( node-with-value-1 ) 
 + sumNode( node-with-value-3 ) ;  

return 5 + 4 
 + 2 + sumNode(null ) + sumNode( null )
 + sumNode( node-with-value-1 ) 
 + sumNode( node-with-value-3 ) ;  

return 5 + 4 
 + 2 + 0 + 0
 + sumNode( node-with-value-1 ) 
 + sumNode( node-with-value-3 ) ; 

return 5 + 4 
 + 2 + 0 + 0
 + 1 + sumNode(null ) + sumNode( null )
 + sumNode( node-with-value-3 ) ; 

return 5 + 4 
 + 2 + 0 + 0
 + 1 + 0 + 0
 + sumNode( node-with-value-3 ) ; 

return 5 + 4 
 + 2 + 0 + 0
 + 1 + 0 + 0
 + 3 + sumNode(null ) + sumNode( null ) ; 

return 5 + 4 
 + 2 + 0 + 0
 + 1 + 0 + 0
 + 3 + 0 + 0 ;

return 5 + 4 
 + 2 + 0 + 0
 + 1 + 0 + 0
 + 3 ;

return 5 + 4 
 + 2 + 0 + 0
 + 1 
 + 3  ;

return 5 + 4 
 + 2 
 + 1 
 + 3  ;

return 5 + 4 
 + 3
 + 3  ;

return 5 + 7
 + 3  ;

return 5 + 10 ;

return 15 ;

এখন দেখুন কীভাবে আমরা সম্মিলিত গভীরতার একটি কাঠামো এবং "শাখাবদ্ধতা" জয় করেছিলাম, এটি একটি যৌগিক টেমপ্লেটের পুনরাবৃত্তি হিসাবে বিবেচনা করে? প্রতিবার আমাদের SumNode ফাংশনটির মাধ্যমে, আমরা কেবলমাত্র একটি একক নোডের সাথে ডিল করেছি, যদি একটি / তারপরে শাখা ব্যবহার করি, এবং দুটি সাধারণ রিটার্ন স্টেটমেন্ট যা প্রায় তাদের থ্রিজগুলি লিখেছিল, সরাসরি আমাদের স্পেসিফিকেশন থেকে?

How to sum a node:
 If a node is null 
   its sum is zero
 otherwise 
   its sum is its value 
   plus the sum of its left child node
   plus the sum of its right child node

এটা পুনরাবৃত্তি শক্তি।


উপরের ফুলদানির উদাহরণটি পুচ্ছ পুনরাবৃত্তির একটি উদাহরণ । সমস্ত লেজ পুনরাবৃত্তি অর্থ হ'ল পুনরাবৃত্ত ফাংশনে, যদি আমরা পুনরাবৃত্তি করি (এটি যদি আমরা ফাংশনটিকে আবারও ডাকি), এটি ছিল আমাদের শেষ কাজ।

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

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

এখন একটি অপারেশন তাকান যেখানে অর্ডার বিষয়টি বিবেচনা করে। আমরা নোডের একটি বাইনারি গাছ ব্যবহার করব, তবে এবার অনুষ্ঠিত মানটি একটি সংখ্যা নয়, একটি অক্ষর হবে।

আমাদের গাছ যে কোনো নোড জন্য, তার চরিত্র আসে একটি বিশেষ সম্পত্তি হবে পরে চরিত্র তার বাম সন্তানের দ্বারা এবং অনুষ্ঠিত (ক্রম অনুযায়ী) সামনে (ক্রম অনুযায়ী) অক্ষর এর ডান সন্তান দ্বারা অনুষ্ঠিত।

আমরা যা করতে চাই তা হ'ল গাছটিকে বর্ণানুক্রমিক ক্রমে মুদ্রণ করা। গাছটি বিশেষ সম্পত্তি দেওয়া, এটি করা সহজ। আমরা কেবল বাম শিশুটি, তারপরে নোডের চরিত্রটি, তারপরে ডান শিশুটি প্রিন্ট করব।

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

কোডে এটি দেখতে দিন:

struct node {
  node* left;
  node* right;
  char value;
} ;

// don't worry about this code
class Printer {
  private ostream& out;
  Printer( ostream& o ) :out(o) {}
  void print( char c ) { out << c; }
}

// worry about this code
int printNode( node* root, Printer& printer ) {
  // if there is no tree, do nothing
  if( root == null ) {
    return ;

  } else { // there is a tree
    printNode( root->left, printer );
    printer.print( value );
    printNode( root->right, printer );
}

Printer printer( std::cout ) ;
node* root = makeTree() ; // this function returns a tree, somehow
printNode( root, printer );

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

এখন যদি আমাদের গাছটি দেখতে এমন হয়:

         k
        / \
       h   n
      /\   /\
     a  j @  @
    /\ /\
    @@ i@
       /\
       @@

আমরা কী ছাপব?

From k, we go left to
  h, where we go left to
    a, where we go left to 
      null, where we do nothing and so
    we return to a, where we print 'a' and then go right to
      null, where we do nothing and so
    we return to a and are done, so
  we return to h, where we print 'h' and then go right to
    j, where we go left to
      i, where we go left to 
        null, where we do nothing and so
      we return to i, where we print 'i' and then go right to
        null, where we do nothing and so
      we return to i and are done, so
    we return to j, where we print 'j' and then go right to
      null, where we do nothing and so
    we return to j and are done, so
  we return to h and are done, so
we return to k, where we print 'k' and then go right to
  n where we go left to 
    null, where we do nothing and so
  we return to n, where we print 'n' and then go right to
    null, where we do nothing and so
  we return to n and are done, so 
we return to k and are done, so we return to the caller

সুতরাং আমরা যদি কেবল লাইনগুলি দেখি তবে আমরা কী ছাপলাম:

    we return to a, where we print 'a' and then go right to
  we return to h, where we print 'h' and then go right to
      we return to i, where we print 'i' and then go right to
    we return to j, where we print 'j' and then go right to
we return to k, where we print 'k' and then go right to
  we return to n, where we print 'n' and then go right to

আমরা দেখতে পেয়েছি যে আমরা "অহিজন" মুদ্রিত করেছি, যা প্রকৃতপক্ষে বর্ণানুক্রমিক ক্রমে রয়েছে।

বর্ণানুক্রমিক ক্রমে একটি নোড কীভাবে প্রিন্ট করতে হয় তা জেনে আমরা বর্ণমালা অনুসারে একটি সম্পূর্ণ গাছ মুদ্রণ পরিচালনা করি manage যা ঠিক ছিল (কারণ আমাদের গাছে বর্ণের পরে বর্ণের বামে মানগুলি অর্ডার করার বিশেষ সম্পত্তি ছিল) নোডের মান মুদ্রণের আগে বাম সন্তানের মুদ্রণ করা এবং নোডের মান মুদ্রণের পরে ডান সন্তানের মুদ্রণ করা জেনে ছিল।

আর যে পুনরাবৃত্তির শক্তি: শুধুমাত্র কিভাবে পুরো একটি অংশ করতে বুদ্ধিমান (এবং যখন recursing থামাতে বুদ্ধিমান) দ্বারা পুরো জিনিস করতে সক্ষম হচ্ছে।

এটি বেশিরভাগ ভাষায় স্মরণ করে অপারেটর || ("বা") শর্ট সার্কিট যখন এর প্রথম অপারেন্ডটি সত্য হয়, তখন সাধারণ পুনরাবৃত্তির কাজটি হয়:

void recurse() { doWeStop() || recurse(); } 

লুক এম মন্তব্য করেছেন:

এই জাতীয় উত্তরের জন্য একটি ব্যাজ তৈরি করা উচিত। অভিনন্দন!

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

এখানে আমার মন্তব্য দেখুন: /programming/128434/ কি-are-commune-wiki-posts-in-stackoverflow / 718699#718699


35

আপনার মস্তিষ্ক ফুঁড়ে উঠেছে কারণ এটি অসীম পুনরাবৃত্তিতে ডুবে গেছে। এটি একটি সাধারণ প্রাথমিক ভুল mistake

বিশ্বাস করুন বা না করুন, আপনি ইতিমধ্যে পুনরাবৃত্তি বুঝতে পেরেছেন, আপনাকে কেবল কোনও ক্রিয়াকলাপের জন্য সাধারণ, তবে ত্রুটিযুক্ত রূপক দ্বারা টেনে নামিয়ে আনা হচ্ছে: স্টাফ সহ একটি ছোট্ট বাক্স যা সামনে আসে।

কোনও কার্য বা পদ্ধতির পরিবর্তে চিন্তা করুন, যেমন "নেটে পুনরাবৃত্তি সম্পর্কে আরও সন্ধান করুন"। এটি পুনরাবৃত্ত এবং এটিতে আপনার কোনও সমস্যা নেই। এই কাজটি সম্পন্ন করার জন্য আপনি:

ক) "পুনরাবৃত্তি" এর জন্য গুগলের ফলাফল পৃষ্ঠাটি পড়ুন
খ) একবার আপনি এটি পড়ার পরে, তার প্রথম লিঙ্কটি অনুসরণ করুন এবং ...
a.1) পুনরাবৃত্তি সম্পর্কে নতুন পৃষ্ঠাটি পড়ুন 
খ .১) একবার আপনি এটি পড়ার পরে, তার প্রথম লিঙ্কটি অনুসরণ করুন এবং ...
a.2) পুনরাবৃত্তি সম্পর্কে নতুন পৃষ্ঠাটি পড়ুন 
খ .২) একবার আপনি এটি পড়ার পরে, তার প্রথম লিঙ্কটি অনুসরণ করুন এবং ...

আপনি দেখতে পাচ্ছেন যে আপনি দীর্ঘকাল ধরে কোনও সমস্যা ছাড়াই পুনরাবৃত্ত স্টাফগুলি করে চলেছেন।

আর কতক্ষণ আপনি এই কাজটি চালিয়ে যাবেন? চিরকাল আপনার মস্তিস্ক আপ না হওয়া পর্যন্ত? অবশ্যই না, আপনি যখনই কাজটি সম্পন্ন করেছেন বিশ্বাস করেন আপনি একটি নির্দিষ্ট সময়ে থামবেন stop

আপনাকে "নেটে পুনরাবৃত্তি সম্পর্কে আরও সন্ধান করতে" জিজ্ঞাসা করার সময় এটি নির্দিষ্ট করার দরকার নেই, কারণ আপনি একজন মানুষ এবং আপনি নিজেই এটি আবিষ্কার করতে পারেন।

কম্পিউটার এর জ্যাক অনুমান করতে পারে না, সুতরাং আপনার অবশ্যই একটি স্পষ্ট সমাপ্তি অন্তর্ভুক্ত করতে হবে: "নেটটিতে পুনরাবৃত্তি সম্পর্কে আরও সন্ধান করুন, আপনি এটি বুঝতে পারবেন বা আপনি সর্বাধিক 10 পৃষ্ঠা পড়েছেন "।

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

"নেটটিতে পুনরাবৃত্তি সম্পর্কে আরও সন্ধান করুন, আপনি এটি বুঝতে না পারলে বা আপনি সর্বোচ্চ 10 টি পৃষ্ঠা পড়ে এবং www.google.com/search?q=recursion এ শুরু করেছেন "

পুরো জিনিসটি আঁকতে, আমি আপনাকে এই বইয়ের যে কোনও একটি চেষ্টা করার পরামর্শ দিচ্ছি:

  • প্রচলিত লিস্প: প্রতীকী গণনার একটি নম্র ভূমিকা। এটি পুনরাবৃত্তির চতুরতম অ-গাণিতিক ব্যাখ্যা।
  • ছোট স্কিমার

6
"ফাংশন = আই / ও এর ছোট বাক্স" এর রূপক ততক্ষণ পুনরাবৃত্তির সাথে কাজ করে যতক্ষণ আপনি কল্পনাও করেন যে অসীম ক্লোন তৈরির কোনও কারখানা আছে এবং আপনার ছোট বাক্সটি অন্যান্য ছোট বাক্সগুলিকে গ্রাস করতে পারে।
প্রশংসাপত্র

2
আকর্ষণীয়..সেই, ভবিষ্যতে রোবটগুলি কিছু গুগল করবে এবং প্রথম 10 লিঙ্কগুলি ব্যবহার করে নিজে শিখবে। :) :)
কুমার 16

2
@ কুমার গুগল ইন্টারনেট নিয়ে ইতিমধ্যে তা করছে না ..?
টিজে

1
দুর্দান্ত বই, সুপারিশের জন্য ধন্যবাদ
ম্যাক্স কোরটস্কি

"আপনার মস্তিষ্ক ফুঁসে উঠেছে কারণ এটি অসীম পুনরাবৃত্তিতে পড়ে That's এটি একটি সাধারণ প্রাথমিক ভুল" "
স্টোর আন্ডারফ্লো

26

পুনরাবৃত্তি বুঝতে, আপনাকে যা করতে হবে তা হ'ল আপনার শ্যাম্পুর বোতলটির লেবেলটি দেখুন:

function repeat()
{
   rinse();
   lather();
   repeat();
}

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


6
আপনাকে ধন্যবাদ দার 7 স্টাইল - এটি সবসময় আমাকে শ্যাম্পুর বোতলগুলিতে বিরক্ত করে। (আমি অনুমান করি যে আমি সবসময় প্রোগ্রামিংয়ের জন্য নির্ধারিত ছিলাম)। । যদিও আমি লোক নির্দেশাবলী শেষে একই পদ্ধতি পুনরাবৃত্তি করুন "যুক্ত করতে 'সিদ্ধান্ত নিয়েছে তৈরি কোম্পানী লক্ষ বাজি ধরে বলতে পারি
kenj0418

5
আমি আশা করি আপনার rinse()পরেlather()
কোডারডেনিস

টেক-কল অপ্টিমাইজেশন ব্যবহার করা হলে @ জ্যাক উইলসন - নিশ্চিত sure যদিও এটি বর্তমানে দাঁড়িয়েছে - যদিও এটি সম্পূর্ণ বৈধ পুনরাবৃত্তি।

1
@ ডার ylাইল তাই সে কারণেই আমার শ্যাম্পুর বোতল সর্বদা খালি ...
ব্র্যান্ডন লিং

11

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


এবং তারপরে হাফস্ট্যাডারের বাকী বইগুলিতে ঘুরে বেড়ানো। এই মুহুর্তে আমার প্রিয় কবিতার অনুবাদটির একটি: লে টন বিউ ডো মারোট । সুনির্দিষ্টভাবে কোনও সিএস বিষয় নয়, তবে অনুবাদটি আসলে কী এবং এর অর্থ কী তা আকর্ষণীয় বিষয় উত্থাপন করে।
আরবেরটিগ

9

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

গুণনের কথা বললে, এটি ভাবুন।

প্রশ্ন:

একটি * খ কি?

উত্তর:

খ যদি 1 হয়, এটি একটি। অন্যথায়, এটি একটি + এ * (বি -1)।

একটি * (বি -১) কী? এটি কার্যকর করার জন্য উপরের প্রশ্নটি দেখুন।


@ অ্যান্ড্রু গ্রিম: ভাল প্রশ্ন। এই সংজ্ঞাটি প্রাকৃতিক সংখ্যার জন্য, পূর্ণসংখ্যার জন্য নয়।
এসলট

9

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

function writeNumbers( aNumber ){
 write(aNumber);
 if( aNumber > 0 ){
  writeNumbers( aNumber - 1 );
 }
 else{
  return;
 }
}

এই ফাংশনটি প্রথম সংখ্যা থেকে সমস্ত নম্বর মুদ্রণ করবে আপনি এটি 0 পর্যন্ত খাওয়াবেন। সুতরাং:

writeNumbers( 10 );
//This wil write: 10 9 8 7 6 5 4 3 2 1 0
//and then stop because aNumber is no longer larger then 0

মূলত যা ঘটে তা হ'ল রাইটিং নাম্বার (10) 10 লিখবে এবং তারপরে রাইটিং নাম্বার (9) কল করবে যা 9 লিখবে এবং তারপরে রাইটিং নাম্বার (8) কল করবে। যতক্ষণ না রাইটিং নাম্বার (1) 1 লিখে এবং তারপরে রাইটিং নাম্বার (0) কল করবে যা 0 লিখবে বাট লিখিত নম্বরগুলিতে কল করবে না (-1);

এই কোডটি মূলত:

for(i=10; i>0; i--){
 write(i);
}

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

var nestedArray = Array('Im a string', 
                        Array('Im a string nested in an array', 'me too!'),
                        'Im a string again',
                        Array('More nesting!',
                              Array('nested even more!')
                              ),
                        'Im the last string');
function printArrayItems( stringOrArray ){
 if(typeof stringOrArray === 'Array'){
   for(i=0; i<stringOrArray.length; i++){ 
     printArrayItems( stringOrArray[i] );
   }
 }
 else{
   write( stringOrArray );
 }
}

printArrayItems( stringOrArray );
//this will write:
//'Im a string' 'Im a string nested in an array' 'me too' 'Im a string again'
//'More nesting' 'Nested even more' 'Im the last string'

এই ফাংশনটি এমন একটি অ্যারে নিতে পারে যা 100 টি স্তরে নেস্ট করা যায়, আপনি যখন লুপের জন্য লিখেন তখন আপনাকে এটি 100 বার বাসা বাঁধতে হবে:

for(i=0; i<nestedArray.length; i++){
 if(typeof nestedArray[i] == 'Array'){
  for(a=0; i<nestedArray[i].length; a++){
   if(typeof nestedArray[i][a] == 'Array'){
    for(b=0; b<nestedArray[i][a].length; b++){
     //This would be enough for the nestedAaray we have now, but you would have
     //to nest the for loops even more if you would nest the array another level
     write( nestedArray[i][a][b] );
    }//end for b
   }//endif typeod nestedArray[i][a] == 'Array'
   else{ write( nestedArray[i][a] ); }
  }//end for a
 }//endif typeod nestedArray[i] == 'Array'
 else{ write( nestedArray[i] ); }
}//end for i

আপনি দেখতে পাচ্ছেন পুনরাবৃত্তির পদ্ধতিটি আরও ভাল।


1
এলওএল - আপনি জাভাস্ক্রিপ্ট ব্যবহার করছেন তা বুঝতে দ্বিতীয় মুহূর্তে আমাকে গ্রহণ করলেন! আমি "ফাংশন" দেখেছি এবং ভেবেছিলাম পিএইচপি তখন বুঝতে পারলাম ভেরিয়েবলগুলি $ দিয়ে শুরু হয় না $ তারপরে আমি ভের শব্দটি ব্যবহারের জন্য সি # ভেবেছিলাম - তবে পদ্ধতিগুলিকে ফাংশন বলা হয় না!
ozzy432836

8

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


1
আমি এই উত্তরের সাথে একমত কৌশলটি হ'ল বেস (সহজতম) কেসটি সনাক্ত এবং সমাধান করা। এবং তারপরে সমস্যাটিকে সেই সহজতম ক্ষেত্রে বিবেচনা করুন (যে আপনি ইতিমধ্যে সমাধান করেছেন)।
সেরজিও আকোস্টা

6

আমি এটি একটি উদাহরণ দিয়ে ব্যাখ্যা করার চেষ্টা করব।

আপনি কি জানেন! কারে কয়? যদি তা না হয়: http://en.wikedia.org/wiki/Factorial

3! = 1 * 2 * 3 = 6

এখানে কিছু সিউডোকোড যায়

function factorial(n) {
  if (n==0) return 1
  else return (n * factorial(n-1))
}

সুতরাং আসুন এটি চেষ্টা করুন:

factorial(3)

এন 0 হয়?

না!

সুতরাং আমরা আমাদের পুনরাবৃত্তি আরও গভীর খনন:

3 * factorial(3-1)

3-1 = 2

2 == 0 হয়?

না!

সুতরাং আমরা আরও গভীর যেতে! 3 * 2 * ফ্যাক্টরিয়াল (2-1) 2-1 = 1

1 == 0 হয়?

না!

সুতরাং আমরা আরও গভীর যেতে! 3 * 2 * 1 * ফ্যাক্টরিয়াল (1-1) 1-1 = 0

0 == 0 হয়?

হ্যাঁ!

আমরা একটি তুচ্ছ মামলা আছে

সুতরাং আমরা 3 * 2 * 1 * 1 = 6

আমি আশা করি আপনাকে সাহায্য করেছে


পুনরাবৃত্তি সম্পর্কে ভাবার জন্য এটি কোনও কার্যকর উপায় নয়। একটি সাধারণ ভুল সূচিতরা হ'ল পুনরায় স্বরূপ কলটির ভিতরে কী ঘটেছিল তা কল্পনা করার চেষ্টা করা , কেবল বিশ্বাস করা / প্রমাণ করার পরিবর্তে এটি সঠিক উত্তরটি ফিরে আসবে - এবং এই উত্তরটি এটি উত্সাহিত করে বলে মনে হচ্ছে।
শ্রীভাতসার আর

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

1
[আমি ভোট -১, বিটিডাব্লু।) আপনি এইরকম চিন্তা করতে পারেন: ফ্যাক্টরিয়াল (এন -1) বিশ্বাস করে সঠিকভাবে (এন -1) দেয়! = (এন -1) * ... * 2 * 1, তারপরে n ফ্যাক্টরিয়াল (এন -1) n * (n-1) দেয় ... * 2 * 1, যা এন! বা যাই হোক না কেন. [আপনি যদি পুনরাবৃত্ত ফাংশনগুলি কীভাবে নিজে লিখতে হয় তা শেখার চেষ্টা করছেন, কেবল কোনও ফাংশন কী করে তা দেখুন না]]
শ্রীভাতসার

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

5

recursion

মেথড এ, কল করে মেথড এ কল করে মেথড এ। পরিণামে এই পদ্ধতিগুলির একটিতে কল হবে এবং প্রস্থান হবে না, তবে এটি পুনরাবৃত্তি কারণ কিছু নিজেকে কল করে।

পুনরাবৃত্তির উদাহরণ যেখানে আমি হার্ড ড্রাইভে প্রতিটি ফোল্ডারের নাম মুদ্রণ করতে চাই: (সি # তে)

public void PrintFolderNames(DirectoryInfo directory)
{
    Console.WriteLine(directory.Name);

    DirectoryInfo[] children = directory.GetDirectories();

    foreach(var child in children)
    {
        PrintFolderNames(child); // See we call ourself here...
    }
}

এই উদাহরণে বেস কেস কোথায়?
কুণাল মুখোপাধ্যায়

4

আপনি কোন বই ব্যবহার করছেন?

অ্যালগরিদমের স্ট্যান্ডার্ড পাঠ্যপুস্তক যা আসলে ভাল তা হ'ল Cormen এবং Rivest। আমার অভিজ্ঞতা হ'ল এটি পুনরাবৃত্তিটি বেশ ভালভাবে শেখায়।

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

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


4

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


4

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

লুপ জন্য:

public printBar(length)
{
  String holder = "";
  for (int index = 0; i < length; i++)
  {
    holder += "*"
  }
  return holder;
}

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

public String printBar(int Length) // Method, to call the recursive function
{
  printBar(length, 0);
}

public String printBar(int length, int index) //Overloaded recursive method
{
  // To get a better idea of how this works without a for loop
  // you can also replace this if/else with the for loop and
  // operationally, it should do the same thing.
  if (index >= length)
    return "";
  else
    return "*" + printBar(length, index + 1); // Make recursive call
}

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


javabat.com একটি অত্যন্ত সহায়ক ওয়েবসাইট যা একজনকে পুনরাবৃত্তভাবে চিন্তা করতে সহায়তা করবে। আমি সেখানে গিয়ে নিজেরাই পুনরাবৃত্ত সমস্যাগুলি সমাধান করার চেষ্টা করার পরামর্শ দিচ্ছি।
প্যারাডিয়াস

3

পুনরাবৃত্তির ক্রিয়াকলাপটি নির্মাণের দিকে তাকানোর সত্যিকারের গাণিতিক উপায়টি হ'ল

1: কল্পনা করুন যে আপনার কোনও ফাংশন রয়েছে যা চ (এন-1) এর জন্য সঠিক, এফ তৈরি করুন যাতে চ (এন) সঠিক। 2: চ নির্মাণ করুন, যেমন চ (1) সঠিক।

এইভাবে আপনি প্রমাণ করতে পারবেন যে ফাংশনটি সঠিক, গাণিতিকভাবে, এবং একে বলা হয় ইন্ডাকশন । এটি বিভিন্ন বেস কেস, বা একাধিক ভেরিয়েবলের আরও জটিল ক্রিয়াকলাপগুলির সমতুল্য)। এফ (এক্স) সমস্ত এক্স এর জন্য সঠিক কিনা তা কল্পনা করার সমতুল্য

এখন একটি "সাধারণ" উদাহরণের জন্য। এমন একটি ফাংশন তৈরি করুন যা নির্ধারণ করতে পারে যে এক্স সেন্ট করার জন্য 5 সেন্ট এবং 7 সেন্টের একটি মুদ্রার সংমিশ্রণ পাওয়া সম্ভব কিনা determine উদাহরণস্বরূপ, 2x5 + 1x7 দ্বারা 17 সেন্ট থাকা সম্ভব তবে 16 সেন্ট হওয়া অসম্ভব।

এখন কল্পনা করুন আপনার একটি ফাংশন রয়েছে যা আপনাকে x সেন্ট হিসাবে যতক্ষণ x <এন তৈরি করা সম্ভব তা বলে দেয়। এই ফাংশনটি can_create_coins_small কল করুন। কীভাবে এন এর জন্য ফাংশন করা যায় তা কল্পনা করা মোটামুটি সহজ হওয়া উচিত। এখন আপনার ফাংশনটি তৈরি করুন:

bool can_create_coins(int n)
{
    if (n >= 7 && can_create_coins_small(n-7))
        return true;
    else if (n >= 5 && can_create_coins_small(n-5))
        return true;
    else
        return false;
}

কৌতুকটি এখানে উপলব্ধি করা যায় যে can_create_coins n এর জন্য কাজ করে, এর অর্থ হল আপনি can_create_coins কে can_create_coins_small এর বিকল্প হিসাবে দিতে পারেন:

bool can_create_coins(int n)
{
    if (n >= 7 && can_create_coins(n-7))
        return true;
    else if (n >= 5 && can_create_coins(n-5))
        return true;
    else
        return false;
}

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

bool can_create_coins(int n)
{
    if (n == 0)
        return true;
    else if (n >= 7 && can_create_coins(n-7))
        return true;
    else if (n >= 5 && can_create_coins(n-5))
        return true;
    else
        return false;
}

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

আপনার টাওয়ার অফ হ্যানয় সমস্যা সমাধানের জন্য এই তথ্যটি ব্যবহার করার জন্য, আমি মনে করি কৌশলটি হ'ল এন -1 ট্যাবলেটগুলি একটি থেকে বিতে (যে কোনও এক / খের জন্য) সরিয়ে নেওয়ার জন্য একটি ফাংশন রয়েছে তা ধরে নেওয়া, এন টেবিলগুলি একটি থেকে বিতে সরিয়ে নিয়ে যাওয়ার চেষ্টা করছেন ।


3

সহজ রিকার্সিভ উদাহরণ প্রচলিত পাতার মর্মর :

মাইম্যাপ একটি তালিকার প্রতিটি উপাদানগুলিতে একটি ফাংশন প্রয়োগ করে।

1) খালি তালিকার কোনও উপাদান নেই, তাই আমরা খালি তালিকাটি ফিরিয়ে দিই - () এবং এনআইএল উভয়ই খালি তালিকা।

2) প্রথম তালিকায় ফাংশনটি প্রয়োগ করুন, বাকী তালিকার জন্য এমওয়াইএম্যাপ কল করুন (পুনরাবৃত্ত কল) এবং উভয় ফলাফলকে একটি নতুন তালিকার সাথে সংযুক্ত করুন।

(DEFUN MYMAP (FUNCTION LIST)
  (IF (NULL LIST)
      ()
      (CONS (FUNCALL FUNCTION (FIRST LIST))
            (MYMAP FUNCTION (REST LIST)))))

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

এই উদাহরণটি তালিকার প্রতিটি সংখ্যায় SIN ফাংশনটিকে কল করে (1 2 3 4)।

Command: (mymap 'sin '(1 2 3 4))

1 Enter MYMAP SIN (1 2 3 4)
| 2 Enter MYMAP SIN (2 3 4)
|   3 Enter MYMAP SIN (3 4)
|   | 4 Enter MYMAP SIN (4)
|   |   5 Enter MYMAP SIN NIL
|   |   5 Exit MYMAP NIL
|   | 4 Exit MYMAP (-0.75680256)
|   3 Exit MYMAP (0.14112002 -0.75680256)
| 2 Exit MYMAP (0.9092975 0.14112002 -0.75680256)
1 Exit MYMAP (0.841471 0.9092975 0.14112002 -0.75680256)

এটি আমাদের ফলাফল :

(0.841471 0.9092975 0.14112002 -0.75680256)

সমস্ত ক্যাপ সঙ্গে কি? গুরুতরভাবে, যদিও তারা প্রায় 20 বছর আগে এলআইএসপি-র স্টাইলের বাইরে চলে যায়।
সেবাস্তিয়ান ক্রোগ

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

3

ছয় বছর বয়সী ব্যক্তির পুনরাবৃত্তি ব্যাখ্যা করতে, প্রথমে এটি পাঁচ বছর বয়সী ব্যক্তির কাছে ব্যাখ্যা করুন এবং তারপরে এক বছর অপেক্ষা করুন।

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

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

প্রকৃতপক্ষে, এটি পুনরাবৃত্তির সাহায্যে কীভাবে সমস্যা সমাধান করা যায় তার পুনরাবৃত্ত সংজ্ঞা ছিল।


3

শিশুরা স্পষ্টতই পুনরাবৃত্তি ব্যবহার করে, উদাহরণস্বরূপ:

ডিজনি ওয়ার্ল্ড রোড ট্রিপ

আমরা কি এখনও রয়েছি? (না)

আমরা কি এখনও রয়েছি? (শীঘ্রই)

আমরা কি এখনও রয়েছি? (প্রায় ...)

আমরা কি এখনও রয়েছি? (এসএইচএইচ এইচ)

আমরা কি এখনও সেখানে আছি? (!!!!!)

কোন সময়ে শিশুটি ঘুমিয়ে পড়ে ...

এই কাউন্টডাউন ফাংশন একটি সাধারণ উদাহরণ:

function countdown()
      {
      return (arguments[0] > 0 ?
        (
        console.log(arguments[0]),countdown(arguments[0] - 1)) : 
        "done"
        );
      }
countdown(10);

সফটওয়্যার প্রকল্পগুলিতে হফস্ট্যাটারের আইন প্রয়োগ করাও প্রাসঙ্গিক।

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

তথ্যসূত্র


2

পুনরাবৃত্ত সমাধানগুলির সাথে কাজ করার সময়, আমি সর্বদা চেষ্টা করি:

  • প্রথমে বেস কেসটি স্থাপন করুন অর্থাৎ যখন ফ্যাকটোরিয়াল সমাধানে এন = 1
  • অন্য প্রতিটি ক্ষেত্রে একটি সাধারণ নিয়ম নিয়ে আসার চেষ্টা করুন

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

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

রেফারেন্সের জন্য, আমি রবার্ট সেডজউইক দ্বারা আলগোরিদিমগুলির উচ্চ প্রস্তাব দিই।

আশা করি এইটি কাজ করবে. শুভকামনা।


আমি অবাক হয়েছি যদি প্রথমে কোনও সাধারণ নিয়ম, পুনরাবৃত্ত কল, যা আপনি শুরু করেছিলেন তার চেয়ে "সরল" সাথে আনা ভাল নয়। তারপরে বেস কেসটি সহজতম কেসের উপর ভিত্তি করে সুস্পষ্ট হয়ে উঠতে হবে। পুনরাবৃত্তিমূলকভাবে কোনও সমস্যা সমাধানের বিষয়ে আমি ভাবতে চাই That's
dlaliberte

2

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


1

একটি পুনরাবৃত্ত ফাংশন একটি বসন্তের মতো যা আপনি প্রতিটি কলটিতে কিছুটা সংক্ষেপিত করেন। প্রতিটি পদক্ষেপে, আপনি একটি স্ট্যাকের উপর কিছুটা তথ্য (বর্তমান প্রসঙ্গ) রেখেছেন। চূড়ান্ত পদক্ষেপটি পৌঁছে গেলে, বসন্তটি প্রকাশিত হয়, একই সাথে সমস্ত মান (প্রসঙ্গ) সংগ্রহ করে!

নিশ্চিত নয় যে এই রূপকটি কার্যকর ... :-)

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

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

আমি খুব স্পষ্ট কিনা তা নিশ্চিত নই, তবে আমি শিক্ষাদানের উপাদানগুলির সত্যিকারের বিশ্ব ব্যবহার দেখাতে চাই, কারণ এটি অতীতে আমি হোঁচট খাচ্ছিলাম।


1

একটি কর্মী মৌমাছি চিন্তা করুন। এটি মধু বানানোর চেষ্টা করে। এটি তার কাজটি করে এবং অন্যান্য কর্মী মৌমাছিদের কাছে বাকি মধু তৈরি করার প্রত্যাশা করে। এবং যখন মৌচাক পূর্ণ হয়, এটি বন্ধ হয়ে যায়।

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

উদাহরণস্বরূপ, আমরা একটি তালিকার দৈর্ঘ্য গণনা করতে চাই। আমাদের ফাংশনটিকে যাদুকরী_ দৈর্ঘ্য এবং যাদুকরী_ দৈর্ঘ্যের সাথে আমাদের যাদুকরী সহায়ককে কল করতে দিন আমরা জানি যে আমরা যদি সাব-লিস্টটি দেই যা প্রথম উপাদানটি নেই তবে এটি আমাদের যাদু দ্বারা সাব-লিস্টের দৈর্ঘ্য দেবে। তারপরে আমাদের কেবল কী ভাবতে হবে তা হল কীভাবে এই তথ্যটি আমাদের কাজের সাথে সংহত করা যায়। প্রথম উপাদানটির দৈর্ঘ্য 1 এবং ম্যাজিক_উন্টার আমাদের সাব-লিস্টের দৈর্ঘ্য দেয় N-1, সুতরাং মোট দৈর্ঘ্য (n-1) + 1 -> n

int magical_length( list )
  sublist = rest_of_the_list( list )
  sublist_length = magical_length( sublist ) // you can think this function as magical and given to you
  return 1 + sublist_length

তবে এই উত্তরটি অসম্পূর্ণ কারণ আমরা খালি তালিকা দিলে কী হয় তা আমরা বিবেচনা করি নি। আমরা ভেবেছিলাম যে তালিকায় আমাদের সর্বদা কমপক্ষে একটি উপাদান থাকে। অতএব আমাদের যদি খালি তালিকা দেওয়া হয় এবং অবশ্যই স্পষ্টভাবে উত্তর দেওয়া হয় তবে উত্তরটি কী হওয়া উচিত সে সম্পর্কে আমাদের চিন্তাভাবনা করা উচিত So সুতরাং আমাদের ফাংশনে এই তথ্য যুক্ত করুন এবং এটিকে বেস / এজ শর্ত বলে।

int magical_length( list )
  if ( list is empty) then
    return 0
  else
    sublist_length = magical_length( sublist ) // you can think this function as magical and given to you
    return 1 + sublist_length
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.