পুনরাবৃত্তি একটি নিজস্ব বৈশিষ্ট্য এবং?


116

... নাকি এটা কি অনুশীলন?

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

আমি এখানে জিজ্ঞাসা করছি কারণ আমার সন্দেহ আছে কারওর একটি নির্দিষ্ট উত্তর আছে।

উদাহরণস্বরূপ, নিম্নলিখিত দুটি পদ্ধতির মধ্যে পার্থক্য কী:

public static void a() {
    return a();
    }

public static void b() {
    return a();
    }

" aচিরকাল অব্যাহত থাকে" ব্যতীত (সত্যিকার প্রোগ্রামে এটি ব্যবহারকারীর আবার অবৈধ ইনপুট সরবরাহ করার সময় প্রম্পট করতে সঠিকভাবে ব্যবহৃত হয়) aএবং এর মধ্যে কোনও মৌলিক পার্থক্য রয়েছে bকি? একটি অপ-অপ্টিমাইজড সংকলক, কীভাবে তারা আলাদাভাবে পরিচালনা করা হয়?

অবশেষে এটি নেমে আসে যা return a()থেকে শিখার মাধ্যমে bআমরা return a()সেখান থেকে শিখেছি a। আমরা কি?


24
দুর্দান্ত বিতর্ক। আপনি যদি আপনার প্রফেসরকে এরকম ব্যাখ্যা করে থাকেন তবে আমি অবাক হই। আপনি যদি তা করেন তবে আমার মনে হয় তিনি আপনার হারানো creditণ আপনার কাছে দেবেন।
মাইকেল ইয়াওওয়ারস্কি

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

34
সমস্যা সমাধানের জন্য মার্জিত উপায়ে আসা বা বাক-চিন্তাভাবনা বাদ দিয়ে প্রফেসরের পরিবর্তে তাকে অতিরিক্ত ক্রেডিট দেওয়া উচিত।

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

35
FWIW, ডান না হওয়া পর্যন্ত ইনপুটটির জন্য অনুরোধ করা পুনরাবৃত্তি ব্যবহারের জন্য ভাল জায়গা নয়, স্ট্যাকটিকে উপচে পড়া খুব সহজ। এই নির্দিষ্ট উদাহরণের জন্য, এর মতো কিছু ব্যবহার করা ভাল a() { do { good = prompt(); } while (!good); }
কেভিন

উত্তর:


113

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

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

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

স্ট্যাক ওভারফ্লোস

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

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

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

সুপাঠ্যতা

অন্য কারণটি পঠনযোগ্যতা। কোডটি যে আদর্শের আকাঙ্ক্ষিত হতে হবে তা হ'ল একটি মানব-পঠনযোগ্য নথি, যেখানে প্রতিটি লাইন এটি কী করছে তা কেবল বর্ণনা করে। এই দুটি পন্থা নিন:

private int getInput() {
    int input;
    do {
        input = promptForInput();
    } while (!inputIsValid(input))
    return input;
}

বনাম

private int getInput() {
    int input = promptForInput();
    if(inputIsValid(input)) {
        return input;
    }
    return getInput();
}

হ্যাঁ, এই উভয়ই কাজ করে, এবং হ্যাঁ তারা উভয়ই বোঝা সহজ। তবে দু'টি পদ্ধতির ইংরেজিতে কীভাবে বর্ণনা করা যেতে পারে? আমি মনে করি এটি এমন কিছু হবে:

ইনপুটটি বৈধ না হওয়া পর্যন্ত আমি ইনপুটটির জন্য অনুরোধ করব এবং তারপরে এটি ফিরিয়ে দেব

বনাম

আমি ইনপুটটির জন্য অনুরোধ করব, তবে যদি ইনপুটটি বৈধ হয় তবে আমি এটি ফিরিয়ে দেব, অন্যথায় আমি ইনপুটটি পেয়েছি এবং পরিবর্তে এর ফলাফলটি ফিরিয়ে দেব

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

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


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

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

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

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

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

48

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

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

এই ধরনের সংকলকটির জন্য, আপনি যখন কোনও ফাংশন কল করেন

a();

এটি হিসাবে বাস্তবায়ন করা হয়

move the address of label 1 to variable return_from_a
jump to label function_a
label 1

এবং একটি () এর সংজ্ঞা,

function a()
{
   var1 = 5;
   return;
}

হিসাবে বাস্তবায়ন করা হয়

label function_a
move 5 to variable var1
jump to the address stored in variable return_from_a

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

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

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


উদাহরণস্বরূপ, সি প্রিপ্রসেসর ম্যাক্রোগুলিতে পুনরাবৃত্তি সমর্থন করে না। ম্যাক্রো সংজ্ঞা ফাংশনগুলির সাথে একই রকম আচরণ করে তবে আপনি তাদের পুনরাবৃত্তভাবে কল করতে পারবেন না।
sth

7
আপনার "কনট্রিভড উদাহরণ" এগুলি সমস্তই অনুমোদিত নয়: ফোর্টরান standard 77 স্ট্যান্ডার্ডটি ফাংশনগুলিকে তাদের পুনরাবৃত্তভাবে কল করতে দেয়নি - কারণ আপনি যা বর্ণনা করেন তা মোটামুটি কারণ। (আমি বিশ্বাস করি যে ফাংশনটি সম্পন্ন হওয়ার সময় লাফ দেওয়ার ঠিকানাটি ফাংশন কোডের শেষে বা নিজেই এই বিন্যাসের সমতুল্য কিছুতে সংরক্ষণ করা হয়েছিল)) এটি সম্পর্কে কিছুটা এখানে দেখুন ।
Alexis

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

১৯ Fort০ এর দশকের গোড়ার দিকে আমি একটি ফোর্টরান সংকলনটির একটি কল স্ট্যাক ছিল না। প্রতিটি সাব্রুটিন বা ফাংশনে রিটার্নের ঠিকানা, প্যারামিটার এবং তার নিজস্ব ভেরিয়েবলগুলির স্থিতিশীল মেমরি অঞ্চল ছিল।
প্যাট্রিসিয়া শানাহান 12'14

2
এমনকি টার্বো পাস্কালের কয়েকটি সংস্করণ ডিফল্টরূপে পুনরাবৃত্তি অক্ষম করেছিল এবং এটি সক্ষম করতে আপনাকে একটি সংকলক নির্দেশিকা নির্ধারণ করতে হয়েছিল।
dan04

17

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


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

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

2
@ ভ্যালিটি: টেইল কল এলিমিনেশন? কিছু জেভিএম হয়ত এটি করতে পারে তবে মনে রাখবেন ব্যতিক্রমগুলির জন্য এটি স্ট্যাক ট্রেস বজায় রাখতে হবে। যদি এটি টেল কল নির্মূলের অনুমতি দেয় তবে স্ট্যাক ট্রেস, নির্গতভাবে উত্পন্ন, অকার্যকর হয়ে উঠতে পারে, তাই কিছু জেভিএম সেই কারণে টিসিই করে না।
অিক্টোফায় 11:51

5
যেভাবেই হোক, আপনার ভাঙা কোডটি কম ভাঙতে অপ্টিমাইজেশানের উপর নির্ভর করা বেশ খারাপ রূপ।
সিএইচও

7
+1 দেখুন যে উবুন্টুতে সম্প্রতি লগইন স্ক্রিনটি ভেঙে গেছে যখন ব্যবহারকারী ক্রমাগত এন্টার বোতামটি চাপায়, এক্সবক্সের কাছে একই হ্যাভেন্ড
সেবাস্তিয়ান

13

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

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


10

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

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

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

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

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

public bool foo() 
{
  validInput = GetInput();
  while(!validInput)
  {
    MessageBox.Show("Wrong Input, please try again!");
    validInput = GetInput();
  }
  return hasWon(x, y, piece);
}

আপনি যা করেছেন তা যদি সেইভাবে সমাধান করা যায় তবে আপনি যা করেছেন তা একটি খারাপ অভ্যাস এবং এড়ানো উচিত।


পদ্ধতির নিজেই উদ্দেশ্য হ'ল ইনপুটটি বৈধকরণ করা, তারপরে কল করে অন্য পদ্ধতির ফলাফলটি ফিরিয়ে দেওয়া (এ কারণেই এটি নিজেই ফিরে আসে)। সুনির্দিষ্ট হওয়ার জন্য, এটি টিক-ট্যাক-টো গেমের সরানো বৈধ কিনা তা hasWon(x, y, piece)পরীক্ষা করে এবং তারপরে ফিরে আসে (কেবলমাত্র প্রভাবিত সারি এবং কলামটি পরীক্ষা করতে)।

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

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

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

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

6

সম্ভবত আপনার অধ্যাপক এটি এখনও শেখায় নি, তবে মনে হয় আপনি পুনরাবৃত্তি হওয়ার সুবিধা এবং অসুবিধাগুলি শিখতে প্রস্তুত।

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

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

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


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

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

সমস্ত পুনরাবৃত্তি টেল কল হয় না।
ওয়ারেন শিশ

6

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


1
এটি আমার মাথার বিস্ফোরণ ঘটেছে, বিশেষত আনলম্বদা +1
জন পাওয়েল

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

5

আপনার প্রশ্ন থেকে আমি কী অনুমান করতে পারি তা থেকে ইনপুট ব্যর্থতার ক্ষেত্রে ইনপুট চাওয়ার জন্য পুনরাবৃত্ত ফাংশন ব্যবহার করা ভাল অভ্যাস নয়। কেন?

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

এটি করার জন্য একটি পুনরাবৃত্ত লুপ থাকা Having


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

4
@ ফাই তবে যদি ইনপুটটি বেশ কয়েকবার অবৈধ হয় তবে আপনি একটি স্ট্যাকওভারফ্লো এরিয়ার পাবেন। পুনরাবৃত্তি আরও মার্জিত, তবে আমার দৃষ্টিতে, নিয়মিত লুপের তুলনায় সাধারণত সমস্যা বেশি হয় (স্ট্যাকের কারণে)।
মাইকেল ইয়াওওয়ারস্কি

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

1
@ ফাই while(true)একটি অসীম লুপ। আপনার breakবিবৃতি না থাকলে আমি এতে বিন্দুটি দেখতে পাচ্ছি না, যদি না আপনি আপনার প্রোগ্রামটি ক্র্যাশ করার চেষ্টা করছেন। আমার পয়েন্ট হল, যদি আপনি একই পদ্ধতি কল (যে এর পুনরাবৃত্তির), কখনও কখনও আপনি একটি দেব StackOverflowError , কিন্তু আপনি যদি একটি ব্যবহার whileবা forলুপ, তাই না হবে। একটি নিয়মিত লুপ দিয়ে সমস্যাটি সহজেই বিদ্যমান। হতে পারে আমি আপনাকে ভুল বুঝেছি, কিন্তু আপনার আমার উত্তরটি নেই।
মাইকেল ইয়াওওয়ারস্কি

4
আমার কাছে এটি সত্যই মনে হচ্ছে সম্ভবত প্রকৃত কারণের কারণেই অধ্যাপক নম্বর পেয়েছিলেন =) তিনি এটি খুব ভালভাবে ব্যাখ্যা নাও করতে পারেন, তবে এটি একটি বৈধ অভিযোগ যে আপনি এটি এমনভাবে ব্যবহার করছেন যা খুব খারাপ স্টাইল হিসাবে বিবেচিত হবে যদি না সরাসরি আরও গুরুতর কোডে ত্রুটিযুক্ত।
কমান্ডার ধনিয়া সালাম্যান্ডার

3

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

বৈশিষ্ট্য হিসাবে পুনরাবৃত্তি

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

কোন পুনরাবৃত্তি?

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

অনুশীলন হিসাবে পুনরাবৃত্তি

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

  • বাক্য গঠনটি এখনও খুব বেশি পুনরাবৃত্তি বান্ধব নয়
  • সংকলকরা সেই অনুশীলনটি সনাক্ত করতে এবং এটি অনুকূল করতে পারে না

তলদেশের সরুরেখা

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

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