जिस विधि को मैंने कुछ भाषाओं में लागू किया है और मानता है कि ESRI का उपयोग करता है (क्षमा करें, इस पृष्ठ में कहीं और जेंसन और डोमिंग्यू के अलावा कोई संदर्भ नहीं दिया गया है) एक उपयोगकर्ता द्वारा प्रदान की गई "पी-पॉइंट" सेल या एक सेल शुरू करना है प्रवाह दिशा ग्रिड (fdr) के किनारे पर, अपने आठ पड़ोसियों की जांच करें कि वर्तमान सेल में कौन से प्रत्यक्ष प्रवाह हैं, और उन कोशिकाओं को आउटपुट ग्रिड में वर्तमान "वाटरशेड" में असाइन करें। फिर फ़ंक्शन पुनरावर्ती पड़ोसी के प्रत्येक के लिए एक बार खुद को कॉल करता है। यह प्रक्रिया तब तक दोहराई जाती है जब तक कि सभी प्रलोभन कोशिकाएं एक पाइंट-पॉइंट के लिए समाप्त नहीं हो जाती हैं, और फिर सभी पियर-पॉइंट्स के लिए दोहराएंगी।
पुनरावर्ती एल्गोरिथ्म डिज़ाइन बहुत महंगा हो सकता है क्योंकि यह मेमोरी में बहुत सारे डेटा को होल्ड करने की कोशिश कर सकता है, डिस्क पर स्वैप / पेज कर सकता है, और इसलिए आमतौर पर i / o धीमा हो जाता है।
(रिकवर के विभिन्न तरीकों के बारे में व्हिबर की टिप्पणी नीचे देखें, यदि आप RYO के हैं)
_____________ EDIT _____________
एक उदाहरण के रूप में मेरे पुराने सी कोड को खोदें (ध्यान दें: हालांकि अधिकांश अजगर कमरे से भागना चाहते हैं, बहुत बुरा नहीं होना चाहिए)। यह वर्णन करने के लिए ब्याज की हो सकती है। हालाँकि मैं अब केवल सतही परिचित w / चौड़ाई-पहले बनाम गहराई-पहली पुनरावृत्ति के बारे में सोच रहा हूँ, मेरी दिनचर्या वास्तव में गहराई-पहले है (और यह कि ऊपर मेरी प्राकृतिक भाषा का वर्णन भ्रामक था) इस स्टैकओवरफ़्लो पोस्टिंग के आधार पर (उम्मीद है @) व्हुबेर या किसी अन्य व्यक्ति की तुलना में मुझसे अधिक होशियार / पुष्टि कर सकते हैं)।
कोड: स्पष्टीकरण: 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 */
}