আমি জানি যে এটি বাস্তবায়নের একটি উপায় হ'ল প্রতিবার পরিবর্তন আসার সাথে সাথে রাষ্ট্রটিকে পুনরায় সংশোধন করা, তবে এটি অযৌক্তিক বলে মনে হয়।
কোনও ঘটনা ঘটে যাওয়ার সময়ে যদি পরিবর্তনগুলি প্রয়োগ হয় তবে তা যদি একরকম বা অন্য কোনও উপায়ে বিতরণ না করা হয় তবে প্রতিবার কোনও ঘটনা ঘটে গেলে আপনাকে রাষ্ট্রটির পুনরায় সংশোধন করতে হবে, কারণ চূড়ান্ত অবস্থা প্রাথমিক অবস্থা ছাড়াও একের পর এক পরিবর্তন। এমনকি যদি পরিবর্তনগুলি বিতরণযোগ্য হয় তবে আপনি সাধারণত একটি রাষ্ট্রকে পরের দিকে রূপান্তর করতে চান, যেহেতু আপনি আপনার প্রক্রিয়াটি একটি প্রদত্ত রাষ্ট্র যত দ্রুত পৌঁছেছে তত দ্রুত বন্ধ করতে চান, এবং যেহেতু আপনাকে পরবর্তী রাষ্ট্রটি নির্ধারণ করতে হবে যে এটি নির্ধারণ করার জন্য নতুন একটি হ'ল কাঙ্ক্ষিত রাষ্ট্র।
ফাংশনাল প্রোগ্রামিংয়ে, রাষ্ট্র পরিবর্তনগুলি সাধারণত ফাংশন কল এবং / অথবা ফাংশন পরামিতি দ্বারা প্রতিনিধিত্ব করা হয়।
আপনি কখনই অনুমান করতে পারবেন না যে কখন চূড়ান্ত অবস্থা গণনা করা হবে, আপনার লেজবিহীন পুনরাবৃত্তি ফাংশন ব্যবহার করা উচিত নয়। রাজ্যের একটি স্রোত, যেখানে প্রতিটি রাজ্য পূর্ববর্তীগুলির উপর ভিত্তি করে তৈরি করা ভাল বিকল্প হতে পারে।
সুতরাং আপনার ক্ষেত্রে, আমি স্ক্যালায় নিম্নলিখিত কোড দ্বারা প্রশ্নের উত্তর দেব:
import scala.util.Random
val initState = 0.0
def nextState(state: Double, event: Boolean): Double = if(event) state + 0.3 else state - 0.1 // give a new state
def predicate(state: Double) = state >= 1
// random booleans as events
// nb: must be a function in order to force Random.nextBoolean to be called for each element of the stream
def events(): Stream[Boolean] = Random.nextBoolean #:: events()
val states: Stream[Double] = initState #:: states.zip(events).map({ case (s,e) => nextState(s,e)}) // a stream of all the successive states
// stop when the state is >= 1 ;
// display all the states computed before it stopped
states takeWhile(! predicate(_)) foreach println
উদাহরণস্বরূপ যা দিতে পারে (আমি আউটপুটটি সহজ করেছিলাম):
0.0
0.3
0.2
0.5
0.8
val states: Stream[Double] = ...
ধারাবাহিক রাজ্য গণনা করা হয় যেখানে লাইন।
এই স্ট্রিমের প্রথম উপাদানটি সিস্টেমের প্রাথমিক অবস্থা। zip
ইভেন্টগুলির স্ট্রিমের সাথে রাজ্যের স্রোতকে একত্রে যুক্ত উপাদানগুলির জোড়ের একত্রে প্রবাহিত করে, প্রতিটি জুটি একটি (রাষ্ট্র, ইভেন্ট) হয়ে থাকে। map
পুরানো রাষ্ট্র এবং সম্পর্কিত ইভেন্টের ফাংশন হিসাবে গণনা করে প্রতিটি জুটিকে একক মানতে নতুন রাজ্যে রূপান্তরিত করে। একটি নতুন রাষ্ট্র হ'ল একটি পূর্বে গণিত রাষ্ট্র, এবং যুক্ত ইভেন্ট যা রাষ্ট্রকে "সংশোধন করে"।
সুতরাং মূলত, আপনি একটি সম্ভাব্য অসীম স্ট্রিমের সংজ্ঞা দিন, প্রতিটি নতুন রাজ্যই শেষ গণিত রাষ্ট্রের একটি ক্রিয়াকলাপ এবং একটি নতুন ইভেন্ট। যেহেতু স্ট্রিমগুলি (অন্যদের মধ্যে) স্কালায় অলস, তাই কেবলমাত্র চাহিদা অনুযায়ী গণনা করা হয়, তাই আপনাকে অকেজো রাজ্যগুলি গণনা করতে হবে না এবং আপনি যতগুলি রাজ্য চান তা গণনা করতে পারেন।
যদি আপনি কেবল সেই প্রথম রাজ্যে আগ্রহী হন যা শিকারীকে সম্মান করে তবে কোডের শেষ লাইনটি প্রতিস্থাপন করুন:
states find predicate get
যা পুনরুদ্ধার করে:
res7: Double = 1.1