কার্যকরী ভাষাগুলি পুনরাবৃত্তিতে আরও ভাল?


41

টিএল; ডিআর: ক্রিয়ামূলক ভাষা কি অ-কার্যকরী ভাষাগুলির তুলনায় পুনরাবৃত্তিকে পরিচালনা করে?

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

public int factorial(int x) {
    if (x <= 0)
        return 1;
    else
        return x * factorial(x - 1);
}

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

factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)

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

সুতরাং আমার প্রশ্নটি মূলত:

  • কার্যকরী ভাষাগুলি কি অ-কার্যকরী ভাষাগুলির তুলনায় পুনরাবৃত্তি পরিচালনা করে?

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


10
দৃষ্টিতে কেস: অনেকগুলি কার্যকরী ভাষা টেল কল অপ্টিমাইজেশনের ভারী ব্যবহার করে, যখন খুব কম পদ্ধতিগত ভাষা এটি করে। এর অর্থ এই যে কার্যকরী ভাষায় টেল কল পুনরাবৃত্তি অনেক সস্তা che
জোছিম সউর

7
আসলে, আপনার দেওয়া হাস্কেল সংজ্ঞাটি খুব খারাপ। factorial n = product [1..n]আরও সংক্ষিপ্ত, আরও দক্ষ, এবং বৃহত্তর জন্য স্ট্যাক উপচে পড়ে না n(এবং যদি আপনি স্মৃতিচারণ প্রয়োজন, সম্পূর্ণ ভিন্ন বিকল্পের প্রয়োজন হয়)। productকিছু পদ সংজ্ঞায়িত করা হয় fold, যা করা হয় যাও recursively সংজ্ঞায়িত কিন্তু অত্যন্ত যত্নের সাথে। Recursion হয় একটি গ্রহণযোগ্য সমাধান অধিকাংশ সময়, কিন্তু এটি এখনও সহজে ভুল / দরুণ পর্যাপ্ত করতে হবে।

1
@ জোয়াচিমসৌয়ার - একটি সামান্য শোভন সহ, আপনার মন্তব্যটি একটি উপযুক্ত উত্তর দেবে।
মার্ক বুথ

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

@ ডেলান: স্পষ্টতার জন্য ধন্যবাদ! আমি আমার সম্পাদনা সম্পাদনা করব;)
মার্কো ফিসেট

উত্তর:


36

হ্যাঁ, তারা তা করে তবে কেবল তারা পারে তা নয় , কারণ তাদের রয়েছে

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

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

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


2
রেকর্ডের জন্য, টেল কল নির্মূলকরণ বিশুদ্ধতার উপর নির্ভর করে না।
স্কার্ফ্রিজ

2
@ স্কারফ্রিজ: অবশ্যই তা হয় না। যাইহোক, যখন বিশুদ্ধতা দেওয়া হয়, তখন সংকলকটির পক্ষে লেজ কলগুলির জন্য আপনার কোডটি পুনরায় অর্ডার করা খুব সহজ।
tmadmers

জিসিসি জিএইচসির চেয়ে টিসিওর চেয়ে অনেক ভাল কাজ করে, কারণ আপনি একটি থাঙ্ক তৈরির সময় টিসিও করতে পারবেন না।
ড্যান_ওয়াটারওয়ার্থ

18

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

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

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


আমি ইতিমধ্যে কী প্যাটার্ন ম্যাচিং সম্পর্কে জানি এবং আমি মনে করি এটি হ্যাসেলের একটি দুর্দান্ত বৈশিষ্ট্য যা আমি যে ভাষাগুলিতে ব্যবহার করি তা মিস করি!
মার্কো ফিসেট

@মার্কফ আমার বক্তব্যটি পুনরাবৃত্তি বনাম পুনরাবৃত্তির বিষয়ে সমস্ত কথাবার্তা আপনার কোডের নমুনার স্নিগ্ধতা বিবেচনা করে না। এটি সত্যই প্যাটার্ন মেলানো বনাম শর্তাবলীর সম্পর্কে। আমার উত্তরটি সম্ভবত আমার শীর্ষে রাখা উচিত ছিল।
খ্রিস্টিয়াকক

হ্যাঁ, আমি এটিও বুঝতে পেরেছিলাম: পি
মার্কো-ফিসেট

@ ক্রিস্যাককক: পুনরাবৃত্তি হিসাবে পুনরুক্তিটি দেখা সম্ভব হবে যাতে লুপের শরীরে ব্যবহৃত সমস্ত ভেরিয়েবলগুলি উভয়ই পুনরাবৃত্তি কলগুলির আর্গুমেন্ট এবং রিটার্ন মান?
জর্জিও

@ জর্জিও: হ্যাঁ, আপনার ফাংশনটিকে একই ধরণের একটি ফুপল নিতে এবং ফিরিয়ে দিন।
এরিকসন 2314

5

প্রযুক্তিগতভাবে না, তবে ব্যবহারিকভাবে হ্যাঁ।

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

  1. টেল কল অপটিমাইজেশন। অন্যান্য পোস্টার দ্বারা চিহ্নিত হিসাবে, কার্যকরী ভাষা প্রায়শই TCO প্রয়োজন।

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

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

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


1
পুনরায়: 1. প্রারম্ভিক রিটার্নগুলির টেল কলগুলির সাথে কোনও সম্পর্ক নেই । আপনি একটি পুচ্ছ কলের মাধ্যমে গোড়ার দিকে আসতে পারেন, এবং "প্রয়াত" রিটার্ন একটি লেজ কল বৈশিষ্ট্য আছে, এবং আপনি recursive কল সঙ্গে একটি একক সহজ অভিব্যক্তি থাকতে পারে না একটি পুচ্ছ অবস্থানে (Cf. ওপি এর গৌণিক সংজ্ঞা)।

@ ডেলান: ধন্যবাদ; এটি প্রথম দিকে এবং আমি জিনিসটি অধ্যয়ন করার পরে এটি বেশ কিছুক্ষণ হয়েছে।
টেলাস্টিন

1

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

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

হাস্কেল পুনরাবৃত্ত ফাংশন কল অপ্টিমাইজেশন সমর্থন করে। জাভাতে প্রতিটি ফাংশন কল স্ট্যাক আপ এবং ওভারহেড কারণ।

সুতরাং হ্যাঁ, কার্যকরী ভাষা অন্যদের তুলনায় পুনরাবৃত্তিগুলি পরিচালনা করে।


5
হাস্কেল হ'ল খুব অ-কঠোর ভাষাগুলির মধ্যে - পুরো এমএল পরিবার (কিছু গবেষণা স্পিনঅফস যা অলসতা যুক্ত করে বাদে ), সমস্ত জনপ্রিয় লিস্পস, এরলং ইত্যাদি কঠোর। এছাড়াও, দ্বিতীয় অনুচ্ছেদ বন্ধ মনে হয় - যেমন আপনি সঠিকভাবে প্রথম অনুচ্ছেদে রাষ্ট্র, আলস্য নেই অসীম recursion (Haskell, মঙ্গলাচরণ অত্যন্ত দরকারী হয়েছে পারবেন forever a = a >> forever aউদাহরণস্বরূপ)।

@ দেইনান: আমি যতদূর জানি এসএমএল / এনজেও অলস মূল্যায়নের প্রস্তাব দেয় তবে এটি এসএমএলের একটি সংযোজন। আমি কয়েকটি অলস কার্যকরী ভাষার দুটির নামও দিতে চেয়েছিলাম: মিরান্ডা এবং ক্লিন।
জর্জিও

1

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

দ্রষ্টব্য, এই অপ্টিমাইজেশনটি কোনও পুনরাবৃত্তির কলগুলিতে কাজ করে না , কেবল টেল-কল পুনরাবৃত্ত পদ্ধতি (যেমন পদ্ধতিগুলি যা পুনরাবৃত্তির কল করার সময় রাষ্ট্র বজায় রাখে না)


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

@ ডেলানন: (১) হ্যাঁ, খুব সত্য। এই উত্তরটি আমার 'মূল খসড়া', আমি উল্লেখ করেছিলেন যে :( (2) হ্যাঁ, কিন্তু প্রশ্নের অনুষঙ্গের মধ্যে, আমি মনে কোনো সমস্যা? সেটি নিজের নাও হতে চাই।
স্টিভেন Evers

হ্যাঁ, (২) কেবলমাত্র একটি দরকারী সংযোজন (যদিও ধারাবাহিকতা-পাস করার শৈলীর জন্য অপরিহার্য), উত্তরগুলির উল্লেখ করার দরকার নেই।

1

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

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


0

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

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

সম্পাদনা: ফাইব উদাহরণ দ্বারা, আমি নিম্নলিখিতটি বোঝাতে চাই:

(define (fib n)
 (if (< n 3) 1 
  (+ (fib (- n 1)) (fib (- n 2)))
 )
)

0

কার্যক্ষম ভাষা দুটি খুব নির্দিষ্ট ধরণের পুনরাবৃত্তির ক্ষেত্রে আরও ভাল: লেজ পুনরাবৃত্তি এবং অসীম পুনরাবৃত্তি। এগুলি আপনার factorialউদাহরণের মতো অন্যান্য ধরণের পুনরাবৃত্তিতে অন্যান্য ভাষার মতোই খারাপ ।

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

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

উদাহরণস্বরূপ, ডেলানানের পরামর্শটি factorial n = product [1..n]কেবল আরও সংক্ষিপ্ত এবং পড়া সহজ নয়, এটি অত্যন্ত সমান্তরালও। একটি ব্যবহার করার জন্য একই foldবা reduceআপনার ভাষায় একটি আছে ঘটবে না যদি productইতিমধ্যেই নির্মিত। Recursion এই সমস্যার জন্য শেষ অবলম্বন এর সমাধান। টিউটোরিয়ালগুলিতে এটিকে পুনরাবৃত্তভাবে সমাধান করার মূল কারণটি হ'ল আরও ভাল সমাধানের আগে উত্সাহিত পয়েন্ট হিসাবে, কোনও সেরা অনুশীলনের উদাহরণ হিসাবে নয়।

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