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