আপনি যে প্রোগ্রামিং ল্যাঙ্গুয়েজটি শিখতে চেয়েছিলেন তা আরও সাবলীল হয়ে ওঠার জন্য এটি একটি দুর্দান্ত অনুশীলন, তবে কেবল হালকাভাবে টিনক করেছেন। এর মধ্যে অবজেক্টের সাথে কাজ করা, ক্লোজারগুলি ব্যবহার বা সিমুলেট করা এবং টাইপ সিস্টেমটি প্রসারিত করা জড়িত।
আপনার কাজ হ'ল অলস তালিকাগুলি পরিচালনা করতে কোড লিখুন, তারপরে ফিবোনাকির সংখ্যা উত্পন্ন করার জন্য এই অ্যালগরিদমটি প্রয়োগ করতে এটি ব্যবহার করুন:
কোডের নমুনা হাস্কেল-এ রয়েছে
let fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
in take 40 fibs
ফলাফল:
[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986]
আপনার অলস তালিকা প্রয়োগের এই নির্দেশিকাগুলি মেনে চলতে হবে:
- একটি তালিকা নোড তিনটি জিনিসের মধ্যে একটি:
- শূন্য - খালি তালিকা।
[]
- কনস - একটি আইটেম, বাকি আইটেমের তালিকার সাথে যুক্ত:
1 : [2,3,4,5]
(:
হাস্কেলের কনস অপারেটর) - থাঙ্ক - একটি স্থগিত গণনা যা প্রয়োজন হলে তালিকার নোড তৈরি করে।
- শূন্য - খালি তালিকা।
- এটি নিম্নলিখিত ক্রিয়াকলাপগুলিকে সমর্থন করে:
- শূন্য - একটি খালি তালিকা তৈরি করুন।
- কনস - একটি কনস সেল গঠন করুন।
- থাঙ্ক - একটি থান্ক তৈরি করুন, এমন কোনও ফাংশন দেওয়া হয়েছে যা কোনও আর্গুমেন্ট নেয় না এবং একটি নীল বা কনস ফেরত দেয়।
- বল - একটি তালিকা নোড দেওয়া:
- যদি এটি শূন্য বা কনস হয়, কেবল এটিকে ফেরত দিন।
- যদি এটি একটি থাঙ্ক হয়, তবে নীল বা কনস পেতে তার ফাংশনটিতে কল করুন। থঙ্কটিকে সেই নীল বা কনসের সাথে প্রতিস্থাপন করুন এবং এটি ফিরিয়ে দিন।
দ্রষ্টব্য: থাবকে তার জোর করে মান দিয়ে প্রতিস্থাপন করা "অলস" সংজ্ঞাটির একটি গুরুত্বপূর্ণ অঙ্গ । যদি এই পদক্ষেপটি এড়ানো যায় তবে উপরের ফিবোনাকির অ্যালগোরিদমটি খুব ধীর হবে।
- খালি - একটি তালিকা নোড নীল কিনা তা দেখুন (এটি চাপানোর পরে)।
- হেড (ওরফে "গাড়ি") - তালিকার প্রথম আইটেমটি পান (বা কোনও শিট যদি এটি নিল হয়)।
- লেজ (ওরফে "সিডিআর") - একটি তালিকার মাথার পরে উপাদানগুলি পান (বা এটি নিলে হলে কোনও ফিট নিক্ষেপ করুন)।
- জিপউইথ - একটি বাইনারি ফাংশন দেওয়া (যেমন
(+)
) এবং দুটি (সম্ভবত অসীম) তালিকাগুলি তালিকাগুলির সংশ্লিষ্ট আইটেমগুলিতে প্রয়োগ করুন। উদাহরণ:
zipWith (+) [1,2,3] [1,1,10] == [2,3,13]
- নিন - একটি নম্বর এন এবং একটি (সম্ভবত অসীম) তালিকা দেওয়া হয়েছে, তালিকার প্রথম এন আইটেমগুলি ধরুন।
- মুদ্রণ - একটি তালিকাতে সমস্ত আইটেম মুদ্রণ করুন। দীর্ঘ বা অসীম তালিকা দেওয়া হলে এটি ক্রমবর্ধমানভাবে কাজ করা উচিত।
fibs
নিজের সংজ্ঞায় নিজেকে ব্যবহার করে। অলস পুনরাবৃত্তি সেট আপ করা একটি চতুর কৌশল; আপনাকে এরকম কিছু করতে হবে:- জন্য একটি থাঙ্ক বরাদ্দ
fibs
। আপাতত এটিকে একটি জঘন্য অবস্থায় রেখে দিন। - থঙ্ক ফাংশনটি সংজ্ঞায়িত করুন, যা কোনও রেফারেন্সের উপর নির্ভর করে
fibs
। - তার ফাংশন দিয়ে থাঙ্ক আপডেট করুন।
আপনি কোনও ফাংশন সংজ্ঞায়িত করে এই প্লাম্বিংটি আড়াল করতে চাইতে পারেন
fix
যা একটি নিজস্ব ফিরতি মান সহ একটি তালিকা-ফেরত ফাংশন বলে। একটি সংক্ষিপ্ত ঝাপটায় নেওয়ার বিষয়টি বিবেচনা করুন যাতে এই ধারণাটি সেট হয়ে যায়।- জন্য একটি থাঙ্ক বরাদ্দ
পলিমারফিজম (যে কোনও ধরণের আইটেমের তালিকাগুলির সাথে কাজ করার দক্ষতা) প্রয়োজন হয় না, তবে দেখুন যে আপনি এটির কোনও উপায় খুঁজে পান কিনা তা আপনার ভাষায় মূ .়।
- মেমরি পরিচালনা সম্পর্কে চিন্তা করবেন না। এমনকি আবর্জনা সংগ্রহের ভাষাগুলিতেও বস্তুগুলি নিয়ে যাওয়ার প্রবণতা রয়েছে যা আপনি আর কখনও ব্যবহার করবেন না (উদাহরণস্বরূপ কল স্ট্যাকের উপরে), তাই যদি আপনার প্রোগ্রাম অসীম তালিকায় যাওয়ার সময় মেমরি ফাঁস করে তবে অবাক হবেন না।
আপনার ভাষার বিবরণ সংযোজন করতে বা অলস তালিকার বিকল্প পদ্ধতির অন্বেষণ করতে এই নির্দেশিকা থেকে কিছুটা বিচলিত হন।
নিয়মাবলী:
- এমন ভাষা বেছে নিন যা আপনি ভাল জানেন না। আমি এটি "প্রয়োজন" করতে পারি না, সুতরাং "সম্মান-সিস্টেম" ট্যাগ। তবে, আপনি কোন ভাষায় পোস্ট করেছেন তা ভোটাররা আপনার ইতিহাস পরীক্ষা করতে পারে।
সবকিছু করার জন্য আপনার ভাষার অন্তর্নির্মিত অলস তালিকার সহায়তা ব্যবহার করবেন না। যথেষ্ট বা অন্তত আকর্ষণীয় কিছু পোস্ট করুন।
হাস্কেল বেশ বাইরে আছেন। এটি হ'ল যদি আপনি এই জাতীয় কিছু না করেন:
data List a = IORef (ListNode a) data ListNode a = Nil | Cons !a !(List a) | Thunk !(IO (ListNode a))
দ্রষ্টব্য: হাস্কেলের অ-কঠোর মূল্যায়ন অফ সীমা নয়, তবে আপনার অলস তালিকাগুলির প্রয়োগটি সেখান থেকে সরাসরি তার ক্ষমতা অর্জন করা উচিত নয়। প্রকৃতপক্ষে, একটি দক্ষ, খাঁটি কার্যকরী সমাধান দেখার জন্য আগ্রহী হবে যার জন্য অলসতার প্রয়োজন নেই।
পাইথন:
- ইটারটুলগুলি ব্যবহার করবেন না।
- জেনারেটরগুলি ঠিক আছে, তবে আপনি সেগুলি ব্যবহার করুন, আপনাকে জোর করে মানগুলি স্মরণ করার জন্য কোনও উপায় খুঁজে বের করতে হবে।
zipWith (+) [1,2,3,4,5] [0,0,0] == [1,2,3]
,। তবে উপরের ফিবোনাচি অ্যালগরিদমের পক্ষে এটি কোনও ব্যাপার নয় কারণ জিপবিথের উভয় যুক্তিই অসীম তালিকা।
fibs
সঠিকভাবে প্রয়োগ করার জন্য আপনাকে সঠিকভাবে প্রয়োগ করার জন্য বিশেষ কিছু করা উচিত । আমি অলস পুনরাবৃত্তির বিষয়ে বিস্তারিত জানাতে প্রশ্নটি আপডেট করেছি। এফইউজেডএক্সএক্সএল এটি নিজেই খুঁজে পেয়েছিল।
zipWith
বিভিন্ন দৈর্ঘ্যের দুটি তালিকায় কল করার সময় আচরণটি কী হওয়া উচিত ?