Metode yang telah saya terapkan dalam beberapa bahasa dan percaya bahwa ESRI menggunakan (maaf, tidak ada referensi selain Jenson dan Domingue dikutip di tempat lain di halaman ini) adalah mulai pada sel "titik tuangkan" yang disediakan pengguna atau sel di tepi grid arah aliran (fdr), periksa delapan tetangganya untuk menemukan yang mana dari aliran langsung ke sel saat ini, dan menetapkan sel-sel tersebut ke arus "DAS" di grid output. Kemudian fungsi secara rekursif memanggil dirinya sendiri sekali untuk masing-masing tetangga yang masuk. Proses ini berulang sampai semua sel yang masuk habis untuk titik-tuangkan, dan kemudian akan diulang untuk semua titik-tuangkan.
Desain algoritma rekursif dapat menjadi sangat mahal karena akhirnya dapat mencoba untuk menyimpan banyak data dalam memori, harus menukar / halaman ke disk, dan karena itu umumnya menderita lambat lambat.
(lihat komentar whuber di bawah ini tentang berbagai metode rekursi, jika Anda akan RYO)
_____________ EDIT _____________
Gali kode C lama saya sebagai contoh (catatan: Meskipun sebagian besar pythoners mungkin ingin lari dari ruangan, seharusnya tidak terlalu buruk). Mungkin menarik untuk diilustrasikan. Walaupun saya baru sekarang akrab dengan rekursi mendalam-pertama vs kedalaman-pertama, saya berpikir bahwa rutinitas saya memang kedalaman-pertama (dan bahwa deskripsi bahasa alami saya di atas menyesatkan) berdasarkan posting stackoverflow ini (semoga @ whuber atau orang lain yang lebih pintar dari saya dapat konfirmasi / tolak).
Kode: penjelasan: idir
adalah raster nilai arah aliran. offset
merujuk ke sel tengah yang saat ini sedang dianalisis, dan off
memeriksa masing-masing tetangga sel itu. Ini memanggil fungsi lain does_it_flow_into_me
,, yang mengembalikan boolean, apakah flowdir sel tetangga menunjuk ke sel saat ini. Jika benar untuk tetangga, maka kembalilah ke lokasi itu.
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 */
}