পুনরাবৃত্তি বা যখন লুপগুলি


123

আমি কিছু বিকাশের সাক্ষাত্কার অনুশীলন সম্পর্কে পড়ছিলাম, বিশেষত সাক্ষাত্কারে জিজ্ঞাসা করা প্রযুক্তিগত প্রশ্ন এবং পরীক্ষাগুলি সম্পর্কে এবং জেনারটির বক্তব্যগুলিতে আমি বেশ কয়েকবার হোঁচট খেয়েছি "ঠিক আছে আপনি কিছুক্ষণ লুপ দিয়ে সমস্যার সমাধান করেছেন, এখন আপনি এটি দিয়ে এটি করতে পারেন পুনরাবৃত্তি "," "লুপের সময় প্রত্যেকে 100 টি লাইন দিয়ে এটি সমাধান করতে পারে তবে তারা 5 লাইন পুনরাবৃত্ত ক্রিয়াকলাপে এটি করতে পারে?" প্রভৃতি

আমার প্রশ্ন হ'ল, পুনরাবৃত্তি সাধারণত / যখন / কনস্ট্রাক্টের চেয়ে ভাল হয়?

আমি সত্যই সবসময় ভেবেছিলাম যে পুনরাবৃত্তি পছন্দ করা উচিত নয়, কারণ এটি স্ট্যাক মেমোরির মধ্যে সীমাবদ্ধ যা গাদা থেকে অনেক ছোট, এছাড়াও একটি প্রচুর ফাংশন / পদ্ধতি কল করা একটি পারফরম্যান্সের দিক থেকে বিবেচ্য, তবে আমি সম্ভবত তুমি ভুল...



73
পুনরাবৃত্তির বিষয়টিতে এটি বেশ আকর্ষণীয় দেখায়।
ড্যান_ওয়াটারওয়ার্থ

4
@ উদ্যান_ ওয়াটারওয়ার্থও, এটি সহায়তা করবে: google.fr/… তবে আমি সবসময় মনে করি এটি বানান মিস করে: পি
শিবান ড্রাগন

@ শিভানড্রাগন আমি ভেবেছিলাম ^ _ ^ গতকাল এটি পোস্ট করা খুব উপযুক্ত :-)
নিল

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

উত্তর:


192

পুনরুক্তি লুপগুলির চেয়ে অভ্যন্তরীণভাবে ভাল বা খারাপ নয় - প্রত্যেকটির সুবিধা এবং অসুবিধাগুলি রয়েছে এবং সেগুলি প্রোগ্রামিং ভাষার (এবং বাস্তবায়ন) উপরও নির্ভর করে।

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

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

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

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

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


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

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

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

1
@tdammers আপনি কি আমাকে বলতে পারেন যে আপনি যে স্টাডিটি উল্লেখ করেছেন তা আমি কোথায় পড়তে পারি "অভিজ্ঞতা এবং গবেষণা বলতে বোঝায় যে মানুষের মধ্যে একটি লাইন আছে ..." এটি আমার কাছে খুব আকর্ষণীয় বলে মনে হয়।
Yoo মাৎসুও

2
একটি জিনিস যা আপনি উল্লেখ করতে ভুলে গিয়েছিলেন, পুনরাবৃত্ত কোডটি যখন আপনি কার্যকর করার একক থ্রেডের সাথে কাজ করছেন তখন আরও ভাল সম্পাদন করে।
গর্ডনএম

37

এটা নির্ভর করে.

এটি লক্ষণীয় যে লেজ পুনরাবৃত্তি জন্য সমর্থন লেজ পুনরাবৃত্ত এবং পুনরাবৃত্ত লুপ সমতুল্য, যে, পুনরাবৃত্তি সর্বদা স্ট্যাক নষ্ট করতে হবে না।

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

পরিশেষে, আমি লক্ষ করেছি যে একটি পাঁচ-লাইন সমাধান সম্ভবত 100 লাইন একের চেয়ে ভাল (ধরে নিলে তারা আসলে সমতুল্য) always


5
সুন্দর উত্তর (+1)। "একটি 5 লাইন সমাধান সম্ভবত 100 লাইন একের চেয়ে সর্বদা ভাল": আমি মনে করি সংক্ষিপ্ততা কেবল পুনরাবৃত্তির সুবিধা নয়। একটি পুনরাবৃত্তির কল ব্যবহার আপনাকে বিভিন্ন পুনরাবৃত্তির মানগুলির মধ্যে কার্যকরী নির্ভরতা সুস্পষ্ট করতে বাধ্য করে।
জর্জিও

4
সংক্ষিপ্ত সমাধানগুলি আরও ভাল হতে থাকে তবে অত্যধিক সংশ্লেষ হওয়ার মতো জিনিস রয়েছে।
ড্যান_ ওয়াটারওয়ার্থ

5
@dan_waterworth করতে "100 লাইন 'তুলনা বরং এটা কঠিন হতে মাত্রাতিরিক্ত বাহুল্যবর্জিত
মশা

4
@ জর্জিও, আপনি অপ্রয়োজনীয় কোড অপসারণ করে বা স্পষ্ট বিষয়গুলিকে অন্তর্নিহিত করে প্রোগ্রামগুলিকে আরও ছোট করে তুলতে পারেন। যতক্ষণ আপনি প্রাক্তনের সাথে লেগে থাকবেন, আপনি গুণমান উন্নতি করবেন।
ড্যান_ওয়াটারওয়ার্থ

1
@ জে কে, আমি মনে করি এটি সুস্পষ্ট তথ্যকে অন্তর্নিহিত করার অন্য একটি রূপ। কোন ভেরিয়েবলের জন্য কী ব্যবহার করা হয় সে সম্পর্কিত তথ্যটি তার নাম থেকে সরিয়ে দেওয়া হয় যেখানে এটি স্পষ্ট এবং এটি ব্যবহারের ক্ষেত্রে ঠেলা যায় যা অন্তর্নিহিত।
ড্যান_ওয়াটারওয়ার্থ

17

প্রোগ্রামিংয়ের ক্ষেত্রে "আরও ভাল" সংজ্ঞা দেওয়ার বিষয়ে সর্বজনীনভাবে একমত নেই, তবে আমি এটি "বজায় রাখা / পড়া সহজ" এর অর্থ নিই।

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

সুতরাং, লো এক্সপ্রেসিভ পাওয়ার থেকে উচ্চ এক্সপ্রেশনাল পাওয়ার পর্যন্ত, লুপিং কনস্ট্রাক্টসগুলি এভাবে স্ট্যাক আপ করে:

  • টেইল রিকার্সিভ ফাংশন যা অপরিবর্তনীয় ডেটা ব্যবহার করে,
  • অপরিবর্তনীয় ডেটা ব্যবহার করে এমন পুনরাবৃত্তি ফাংশন,
  • পরিবর্তনীয় ডেটা ব্যবহার করে এমন লুপগুলি যখন,
  • লেজ পুনরাবৃত্ত ফাংশন যা মিউটেবল ডেটা ব্যবহার করে,
  • পরিবর্তনীয় ফাংশন যা মিউটেবল ডেটা ব্যবহার করে,

আদর্শভাবে, আপনি নিজের পক্ষে তৈরি করতে পারেন এমন কমপক্ষে অভিব্যক্তিপূর্ণ কনস্ট্রাক্ট ব্যবহার করবেন। অবশ্যই, যদি আপনার ভাষা টেল কল অপ্টিমাইজেশন সমর্থন করে না, তবে এটি আপনার লুপিং নির্মাণের পছন্দকেও প্রভাবিত করতে পারে।


1
"কিছুক্ষণের জন্য লুপটি একটি লেজ রিকার্সিভ ফাংশনের সমতুল্য এবং পুনরাবৃত্ত ফাংশনগুলির জন্য লেজ পুনরুক্তি হওয়া দরকার না": +১। আপনি কিছুক্ষণ লুপ + একটি স্ট্যাকের মাধ্যমে পুনরাবৃত্তি সিমুলেট করতে পারেন।
জর্জিও

1
আমি নিশ্চিত না যে আমি 100% এর সাথে একমত আছি তবে এটি অবশ্যই একটি আকর্ষণীয় দৃষ্টিভঙ্গি তাই এর জন্য +1।
কনরাড রুডল্ফ

একটি দুর্দান্ত উত্তরের জন্য +1 এবং এটি উল্লেখ করার জন্যও যে কয়েকটি ভাষায় (বা সংকলক) লেজ কল অপ্টিমাইজেশান করে না।
শিবান ড্রাগন

@ জর্জিও, "আপনি কিছুক্ষণ লুপ + একটি স্ট্যাকের মাধ্যমে পুনরাবৃত্তি সিমুলেট করতে পারেন", এ কারণেই আমি অভিব্যক্তিপূর্ণ শক্তি বলেছি। গণনামূলকভাবে, তারা সমান শক্তিমান।
ড্যান_ ওয়াটারওয়ার্থ

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

7

পুনরাবৃত্তি প্রায়শই কম স্পষ্ট হয়। কম সুস্পষ্ট বজায় রাখা কঠিন।

আপনি যদি for(i=0;i<ITER_LIMIT;i++){somefunction(i);}মূল প্রবাহে লিখেন তবে আপনি এটি পুরোপুরি পরিষ্কার করে দিন আপনি লুপ লিখছেন। আপনি যদি লিখেন তবে somefunction(ITER_LIMIT);সত্যিই পরিষ্কার হবে না যে কি হবে। কেবলমাত্র সামগ্রী দেখছে: যে somefunction(int x)কলগুলি somefunction(x-1)আপনাকে বলে দেয় এটি আসলে পুনরাবৃত্তিগুলি ব্যবহার করে একটি লুপ। এছাড়াও, আপনি সহজেই break;অন্য কোথাও পুনরাবৃত্তির সাথে পালানোর শর্তটি সহজে রাখতে পারবেন না , আপনাকে অবশ্যই একটি শর্তসাপেক্ষ যুক্ত করতে হবে যা পুরো পথ পেরিয়ে যাবে, বা একটি ব্যতিক্রম ছুঁড়ে ফেলবে। (এবং ব্যতিক্রমগুলি আবার জটিলতা যুক্ত করে ...)

সংক্ষেপে, যদি এটি পুনরাবৃত্তি এবং পুনরাবৃত্তিগুলির মধ্যে সুস্পষ্ট পছন্দ হয় তবে স্বজ্ঞাত জিনিসটি করুন। যদি পুনরাবৃত্তিটি সহজেই কাজটি করে, 2 লাইন সংরক্ষণ করা খুব কমই মাথাব্যথার পক্ষে মূল্যবান যা এটি দীর্ঘকালীন সময়ে তৈরি করতে পারে।

অবশ্যই যদি এটি আপনার 98 টি লাইন সঞ্চয় করে তবে এটি সম্পূর্ণ আলাদা different

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

মূলত, যদি somefunction(x-1)স্তর থেকে একবারের মধ্যে একবারের মধ্যে থেকে নিজেকে কল করতে হয় তবে পুনরাবৃত্তির কথা ভুলে যান।

... পুনরাবৃত্তি দ্বারা সর্বাধিক সম্পাদিত কর্মগুলির জন্য পুনরাবৃত্তভাবে ফাংশনগুলি লেখা সম্ভব তবে আনন্দদায়ক নয়। আপনি যেখানেই ব্যবহার করবেন না কেন আপনার এমন intকিছু প্রয়োজন stack<int>। আমি এটি একবার করেছিলাম, ব্যবহারিক কাজের চেয়ে ব্যায়াম হিসাবে। আমি আপনাকে আশ্বস্ত করতে পারি যে আপনি যখন এ জাতীয় কোনও কাজের মুখোমুখি হন তখন আপনার সন্দেহের মতো সন্দেহ নেই have


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

5
"যদি তারা একটি লুপ কীওয়ার্ডটি দেখেন তবে তারা জানবে যে এটি একটি লুপ But এটি পুনরাবৃত্ত যে জানতে চান না। একইভাবে, আপনি যখন লুপযুক্ত কোনও ফাংশন কল করবেন তখন আপনি এটি জানতে চান না যে এটিতে একটি লুপ রয়েছে।
জর্জিও

3
@ এসএফ: হ্যাঁ তবে আপনি যদি কেবলমাত্র ফাংশনের বডিটি দেখেন তবে আপনি এটি দেখতে পাবেন। লুপের ক্ষেত্রে, আপনি লুপটি দেখেন, পুনরাবৃত্তির ক্ষেত্রে, আপনি দেখতে পাবেন যে ফাংশনটি নিজেই কল করে।
জর্জিও

5
@ এসএফ: আমার কাছে বৃত্তাকার যুক্তির মত কিছুটা মনে হচ্ছে: "যদি আমার অন্তর্দৃষ্টিতে এটি একটি লুপ হয় তবে এটি আ লুপ হয়।" mapএকটি পুনরাবৃত্ত ফাংশন হিসাবে সংজ্ঞায়িত করা যেতে পারে (উদাহরণস্বরূপ haskell.org/tutorial/funitions.html দেখুন ), এমনকি যদি এটি স্বজ্ঞাতভাবে পরিষ্কার হয় যে এটি একটি তালিকাকে অনুসরণ করে এবং তালিকার প্রতিটি সদস্যের জন্য একটি ফাংশন প্রয়োগ করে।
জর্জিও

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

6

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

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

পুনরাবৃত্তি সম্পর্কিত ক্যাশে বলতে কী বোঝ?
জর্জিও

@ জর্জিও সম্ভবত স্মৃতিচারণ
জে কে।

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

1

পুনরাবৃত্তি ফাংশন পুনরাবৃত্তি কল সম্পর্কে, লুপ স্মৃতিতে রাখা জাম্প পুনরাবৃত্তি সম্পর্কে হয়।

স্ট্যাক ওভারফ্লো সম্পর্কেও উল্লেখ করা উচিত - http://en.wikedia.org/wiki/Stack_overflow


1
পুনরাবৃত্তি বলতে একটি ফাংশন যার সংজ্ঞা নিজেকে কল করতে জড়িত।
হার্ডমাথ

1
যদিও আপনার সাধারণ সংজ্ঞাটি সঠিকভাবে 100% সঠিক নয়, আপনি কেবলমাত্র একমাত্র উল্লেখ করেছেন স্ট্যাকের ওভারফ্লো।
কিউস

1

এটি সত্যই সুবিধা বা প্রয়োজনীয়তার উপর নির্ভর করে:

আপনি যদি প্রোগ্রামিংয়ের ভাষা পাইথন নেন তবে এটি পুনরাবৃত্তি সমর্থন করে, কিন্তু ডিফল্টরূপে পুনরাবৃত্তির গভীরতার (1000) সীমা থাকে। যদি এটি সীমা ছাড়িয়ে যায় তবে আমরা একটি ত্রুটি বা ব্যতিক্রম পাব। এই সীমাটি পরিবর্তন করা যেতে পারে, তবে আমরা যদি তা করি তবে আমরা ভাষায় অস্বাভাবিক পরিস্থিতি অনুভব করতে পারি।

এই সময়ে (পুনরাবৃত্তির গভীরতার চেয়ে কলগুলির সংখ্যা), আমাদের লুপ কনস্ট্রাক্টগুলি পছন্দ করতে হবে। আমি বলতে চাইছি, যদি স্ট্যাকের আকারটি যথেষ্ট না হয় তবে আমাদের লুপটি তৈরি করতে পছন্দ করতে হবে।


3
পাইথনে তিনি লেজ-পুনরাবৃত্তি অপ্টিমাইজেশন কেন চান না তা নিয়ে এখানে একটি গিগো ভ্যান রসমের একটি ব্লগ রয়েছে (বিভিন্ন ভাষায় স্বতন্ত্র কৌশলগত দৃষ্টিভঙ্গি গ্রহণ করা এই ধারণাকে সমর্থন করে)।
হার্ডম্যাথ

-1

কৌশল নকশা প্যাটার্ন ব্যবহার করুন।

  • পুনরাবৃত্তি পরিষ্কার
  • লুপগুলি (তর্কযোগ্যভাবে) দক্ষ

আপনার বোঝার উপর নির্ভর করে (এবং / অথবা অন্যান্য শর্ত), একটি চয়ন করুন।


5
কিসের অপেক্ষা? কৌশল কৌশল এখানে কীভাবে খাপ খায়? এবং দ্বিতীয় বাক্যটি শূন্য বাক্যাংশের মতো শোনাচ্ছে।
কনরাড রুদল্ফ

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

3
আহ। ঠিক আছে, আমি এখনও নিশ্চিত নই যে এটিকে "কৌশল ডিজাইনের ধরণ" বলা যেতে পারে, যার একটি খুব নির্দিষ্ট অর্থ রয়েছে এবং আপনি এটিকে রূপক ব্যবহার করেন। তবে এখন কমপক্ষে আমি দেখতে পাচ্ছি আপনি কোথায় যাচ্ছেন।
কনরাড রুডল্ফ

@ কনরাড রুডলফ একটি গুরুত্বপূর্ণ পাঠ শিখেছে। আপনি যা বলতে চান তা গভীরভাবে ব্যাখ্যা করুন .. ধন্যবাদ .. যা সাহায্য করেছে .. :)
প্রভিন সোনাওয়ান

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