যে পদ্ধতিটি আমি কয়েকটি ভাষায় প্রয়োগ করেছি এবং বিশ্বাস করি যে ইএসআরআই ব্যবহার করে (দুঃখিত, জেনসন এবং ডোমিংয়ে এই পৃষ্ঠার অন্যত্র उद्धृत করা ব্যতীত অন্য কোনও রেফারেন্স) ব্যবহারকারীর সরবরাহিত "pourালাই-পয়েন্ট" সেল বা একটি কোষ থেকে শুরু করা উচিত প্রবাহের দিকের গ্রিড (এফডিআর) এর প্রান্তে, তার বর্তমান আটটি প্রতিবেশী কোনটি বর্তমান কোষে প্রবাহিত হয় তা সন্ধান করতে তার আটটি প্রতিবেশী পরীক্ষা করুন এবং আউটপুট গ্রিডের সেই কোষগুলিকে বর্তমান "ওয়াটারশেড" এ নিয়োগ করুন। তারপরে ফাংশনটি বার বার প্রতিটি প্রবাহিত প্রতিবেশীর জন্য নিজেকে পুনরায় কল করে। সমস্ত প্রবাহিত কোষ একটি pourালা-পয়েন্টের জন্য অবসন্ন না হওয়া অবধি এই প্রক্রিয়াটি পুনরাবৃত্তি করবে এবং তারপরে সমস্ত pourালা-পয়েন্টগুলির জন্য পুনরাবৃত্তি করবে।
রিকার্সিভ অ্যালগরিদম ডিজাইনটি বেশ ব্যয়বহুল হতে পারে কারণ এটি মেমরিতে প্রচুর ডেটা ধরে রাখার চেষ্টা করে, ডিস্কে / পৃষ্ঠার অদলবদল করতে পারে, এবং তাই সাধারণত i / o ধীর গতির ক্ষতি করে।
(পুনরাবৃত্তির বিভিন্ন পদ্ধতি সম্পর্কে নীচে whuber এর মন্তব্য দেখুন, আপনি যদি RYO করছেন)
_____________ সম্পাদনা করুন _____________
উদাহরণস্বরূপ আমার পুরানো সি কোডটি খনন করুন (দ্রষ্টব্য: যদিও বেশিরভাগ অজগররা ঘর থেকে চালাতে চাইতে পারে তবে খুব খারাপ হওয়া উচিত নয়)। ভেবে দেখলাম এটি আগ্রহী হতে পারে। যদিও আমি এখন কেবল মাত্রাতিরিক্তভাবে ডাব্লু / প্রস্থ-প্রথম বনাম গভীরতা-প্রথম পুনরাবৃত্তি, আমি ভাবছি যে আমার রুটিনটি সত্যই গভীরতা-প্রথম (এবং উপরে আমার প্রাকৃতিক ভাষার বর্ণনটি বিভ্রান্তিকর ছিল) এই স্ট্যাকওভারফ্লো পোস্টিংয়ের ভিত্তিতে (আশা করি @ আমার চেয়ে চতুর বা অন্য কেউ নিশ্চিত / অস্বীকার করতে পারে))
কোড: ব্যাখ্যা: idir
প্রবাহের দিকের মানগুলির রাস্টার। offset
কেন্দ্র বিশিষ্ট হওয়া কেন্দ্রটিকে বোঝায় এবং off
সেই ঘরের প্রতিবেশী প্রত্যেককে পরীক্ষা করে। এটি অন্য ফাংশনকে কল করে does_it_flow_into_me
, যা পার্শ্ববর্তী সেলটির ফ্লোডির বর্তমান সেলটিতে নির্দেশ করে কিনা তা সম্পর্কে একটি বুলিয়ান দেয়। যদি প্রতিবেশীর পক্ষে সত্য হয়, তবে সেই অবস্থানটিতে পুনরাবৃত্তি করুন।
void shed(int init_x, int init_y, int basin_id){
int i, j, offset, off, flow_dir;
offset = ((init_y - 1) * nc) + (init_x - 1);
*(basin + offset) = basin_id;
/* kernel analysis */
for (i = -1; i < 2; i++) {
for (j = -1; j < 2; j++) {
if ((i) || (j)) {
off = offset + (j * nc + i);
flow_dir = *(idir + off);
if (does_it_flow_into_me(i,j,flow_dir)){
shed(init_x+i, init_y+j,basin_id);
}
} /*not center */
} /* do - j */
} /* do - i */
}