কোনও সমস্যা সমাধানের জন্য আপনি পুনরাবৃত্তি ব্যবহার করতে পারবেন কিনা তা নির্ধারণ করার জন্য কী বিবেচনাগুলি রয়েছে?


10

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

তবে, কোনও সমস্যা সমাধানের জন্য পুনরাবৃত্তিটি ব্যবহার করা উপযুক্ত কিনা তা সিদ্ধান্ত নেওয়ার আগে আপনি কী বিবেচনা করছেন?


আমার কিছু চিন্তাভাবনা ছিল:

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

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

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

চূড়ান্ত প্রশ্ন হ'ল: কোনও সমস্যা সমাধানের জন্য পুনরাবৃত্তি ব্যবহার করার সিদ্ধান্ত নেওয়ার আগে আপনি কী বিবেচনা করবেন?


7
এটি আসলে বরং সহজ: "যদি আমি ধরে নিতে পারি যে সামান্য ছোট সমস্যার সমাধান জানা যায় তবে সমাধানটি কি নগণ্য?"
কিলিয়ান ফট

তবে ফিবোনাচি নম্বর বা 1অসীম নির্ভুল সংখ্যায় যোগ করার বিষয়ে কী ? আপনি বলতে পারেন, হ্যাঁ, এগুলি একটি ছোট সমস্যা হ্রাস করে, তবে খাঁটি পুনরাবৃত্তি এটি উপযুক্ত নয়
ননপোলারিটি

উত্তর:


15

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

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

মনে রাখবেন যে একটি (সঠিক) পুনরাবৃত্ত সমাধানটি একটি সমান নন-रिकर्सিভ সমাধানে রূপান্তরিত হতে পারে , সুতরাং আপনার অবশ্যই দুটি পদ্ধতির মধ্যে কঠোর পছন্দ করার প্রয়োজন নেই।

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


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


2
কিছু সমস্যা পুনরাবৃত্তি ব্যবহার করে আরও প্রাকৃতিকভাবে প্রকাশ করা হয়। উদাহরণস্বরূপ গাছ ট্র্যাভারসাল।
ফ্র্যাঙ্ক হিলেমান

সেই বক্তব্যটির উত্তর দেওয়ার জন্য আমার উত্তর আপডেট করেছে
স্টিফেন সি

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

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

যাইহোক, প্রথম প্রোগ্রামিং ভাষা আমি শিখেছি (ফরটারন 4) মোটেও পুনরাবৃত্তি সমর্থন করে না।
স্টিফেন সি

1

একজন সি / সি ++ প্রোগ্রামার হিসাবে আমার শীর্ষ বিবেচনাটি হল পারফরম্যান্স। আমার সিদ্ধান্ত প্রক্রিয়া এরকম কিছু:

  1. কল স্ট্যাকের সর্বোচ্চ গভীরতা কত? খুব গভীর হলে, পুনরাবৃত্তি থেকে মুক্তি পান। অগভীর হলে, 2 এ যান।

  2. এই ফাংশনটি কি আমার প্রোগ্রামের বাধা হতে পারে? যদি হ্যাঁ, 3 এ যান If না হলে, পুনরাবৃত্তিটি চালিয়ে যান। যদি নিশ্চিত না হন তবে একজন প্রোফাইলার চালান।

  3. পুনরাবৃত্তি ফাংশন কলগুলিতে ব্যয় করা সিপিইউয়ের ভগ্নাংশটি কী? যদি ফাংশন কলগুলি ফাংশনটির বাকী অংশের তুলনায় উল্লেখযোগ্যভাবে কম সময় নেয় তবে পুনরাবৃত্তিটি ব্যবহার করা ঠিক is


0

তবে, কোনও সমস্যা সমাধানের জন্য পুনরাবৃত্তিটি ব্যবহার করা উপযুক্ত কিনা তা সিদ্ধান্ত নেওয়ার আগে আপনি কী বিবেচনা করছেন?

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

সি ++ এ ফাংশনগুলি লেখার সময়, আমি পুনরাবৃত্ত ফাংশনটি ব্যবহার করার আগে নিজেকে বিতর্ক করতে দেখি। আমি যে প্রশ্নগুলি নিজেকে জিজ্ঞাসা করি সেগুলি হ'ল:

  • পুনরাবৃত্ত অ্যালগরিদম ব্যবহার করে গণনা করা যায়? যদি হ্যাঁ, তবে পুনরাবৃত্তি পদ্ধতির ব্যবহার করুন।

  • মডেলের আকার দ্বারা পুনরাবৃত্তির গভীরতা বৃদ্ধি করতে পারে? আমি সম্প্রতি এমন একটি ক্ষেত্রে দৌড়েছি যেখানে মডেলের আকারের কারণে পুনরাবৃত্তির গভীরতা প্রায় 13000 এ বেড়েছে। আমাকে পুনরাবৃত্তির অ্যালগরিদম পোস্ট-তাত্ক্ষণিক ব্যবহার করতে ফাংশনটি রূপান্তর করতে হয়েছিল।

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

  • একটি পুনরাবৃত্ত অ্যালগরিদম ব্যবহার করে ফাংশনটি খুব সংশ্লেষিত হতে পারে? যদি হ্যাঁ, তবে একটি পুনরাবৃত্তি ফাংশন ব্যবহার করুন। আমি qsortপুনরাবৃত্তির পদ্ধতির সাহায্যে লেখার চেষ্টা করি নি তবে একটি পুনরাবৃত্ত ফাংশন ব্যবহার করার অনুভূতি আমার পক্ষে এটি আরও স্বাভাবিক।


0

ফিবোনাচি সংখ্যাগুলির জন্য, নিষ্পাপ "পুনরাবৃত্তি" কেবল সম্পূর্ণ বোকা। কারণ এটি একই সাবপ্রব্লেমটিকে বারবার সমাধানের দিকে নিয়ে যায়।

ফিবোনাচি সংখ্যার প্রকৃতপক্ষে একটি তুচ্ছ পরিবর্তন রয়েছে যেখানে পুনরাবৃত্তি খুব দক্ষ: একটি সংখ্যা এন n 1 দেওয়া, উভয় ফাইব (এন) এবং ফাইব (এন -1) গণনা করুন। সুতরাং আপনার এমন একটি ফাংশন দরকার যা দুটি ফল দেয়, এই ফাংশনটিকে fib2 কল করতে দেয়।

বাস্তবায়ন বেশ সহজ:

function fib2 (n) -> (fibn, fibnm1) {
    if n ≤ 1 { return (1, 1) }
    let (fibn, fibnm1) = fib2 (n-1)
    return (fibn + fibnm1, fibn)
}

আপনি কি মনে করেন যে আপনি প্রোগ্রামটি একটি সাধারণ ভাষায় লিখতে পারেন? এবং আপনার fib2সংখ্যার জোড় fib2()দেয় এবং আপনার ইন্টারফেসটি ফিট করে না fib(), যা একটি নম্বর দেওয়া হয়, একটি নম্বর ফেরত দেয়। আপনার fib(n)ফিরে আসার কথা মনে হচ্ছে fib2(n)[0]তবে দয়া করে সুনির্দিষ্ট
হোন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.