내가 두 가지 언어로 구현했고 ESRI가 사용한다고 믿는 방법 (죄송합니다,이 페이지의 다른 곳에서 인용 된 Jenson 및 Domingue 이외의 다른 참고 문헌은 없음)은 사용자 제공 "푸어 포인트"셀 또는 셀에서 시작하는 것입니다 흐름 방향 그리드 (fdr)의 가장자리에서 8 개의 이웃을 검사하여 전류 셀로 직접 유입되는 흐름을 찾은 다음 해당 셀을 출력 그리드의 현재 "유역"에 할당합니다. 그런 다음 함수는 유입되는 각 이웃에 대해 한 번씩 재귀 적으로 자신을 호출합니다. 이 프로세스는 모든 유입 셀이 유동점에 대해 소진 될 때까지 반복 된 다음 모든 유동점에 대해 반복됩니다.
재귀 알고리즘 설계는 많은 양의 데이터를 메모리에 저장하려고 시도하고 디스크로 스왑 / 페이징해야하기 때문에 일반적으로 I / O 속도 저하가 발생하기 때문에 상당히 비쌀 수 있습니다.
(RYO를 할 경우 다른 재귀 방법에 대해서는 아래 whuber의 의견을 참조하십시오)
_____________ 수정 _____________
예를 들어 이전 C 코드를 파헤 쳤습니다 (참고 : 대부분의 Pythoners는 방에서 도망 가고 싶지만 너무 나쁘지 않아야합니다). 설명하는 것이 흥미로울 수 있다고 생각했습니다. 난 단지 지금 w / 폭 우선 깊이 우선 재귀 대 표면적으로 잘 알고 있지만, 나는 나의 일상은 참으로 깊이 우선 (내 자연 언어의 설명은 위의 오해였습니다)를 기반이라고 생각하고 이 유래 게시 희망 (@ whuber 또는 나보다 똑똑한 사람은 확인 / 거부 할 수 있습니다).
코드 : 설명 : idir
흐름 방향 값의 래스터입니다. offset
는 현재 분석되고있는 중앙 셀을 참조하고 off
해당 셀의 각 이웃을 확인합니다. 이것은 다른 함수를 호출 does_it_flow_into_me
하는데,이 함수 는 인접 셀의 flowdir이 현재 셀을 가리키는 지 여부에 대한 부울을 리턴합니다. 이웃에 해당하는 경우 해당 위치로 재귀하십시오.
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 */
}