YUBgorithm   6년 전

111111111111111111.png이러한 것처럼 재귀가 풀려나올떄 배열을 초기화 되게 하려고 했는데요.

void copy(int(*arr)[MAX_SIZE], int(*arr2)[MAX_SIZE]) { 
      for (int i = 1; i <= N; i++) {
           for (int j = 1; j <= N; j++) {
                 arr[i][j] = arr2[i][j];
           }
      }
}

이 함수를 써서 재귀 돌기 전과 후에 선언해서 초기화 하려고 했습니다. 

1.전역변수에 복사본 배열 copy_map[Max_size][Max_size] 선언!!

dfs가 return될때 배열을 그 전 상태로 돌려놓지 않고 값을 덮어버린 상태로 유지됨


2. 전역에 선언한 복사본 배열을 지우고 dfs배열 안에 copy_map[Max_size][Max_size] 선언!!

 dfs가 탈출할때 정확하게 값을 return시켜줬습니다. 어떠한 이유로 정확히 값이 return되었을까요? 

'주소값'에 따라 배열을 정확히 return한 걸까요?

어떠한 이유로 값을 제대로 전달해 올수 있었는지 궁금합니다.

 


seico75   6년 전

언제 복사본을 만들고 언제 복원을 하는지 잘 모르겠지만, 

재귀함수 들어가면 복사하고, 리턴할때 복원하다고 가정해보겠습니다.


먼저, 전역 변수는 전체 프로세스에서 하나만 존재하는 거고, 

지역변수는 재귀함수에서는 들어갈때 마다 새로 생성되고 별도로 저장됩니다.


1.  전역변수일 경우, 

한 depth 들어갈때(Depth1) 복사본을 저장합니다. (데이터가 map1이라고 하겠습니다.)

다음 depth 들어갈때(Depth2) 또 복사본을 저장하고 (map2)  나올때 복원하면 전역변수에 저장된 map2가 복원됩니다.

depth1으로 나와서 다시 return 될때에는 전역변수의 값으로 복원할텐데 이미 Depth2에서 map2로 덮어써졌기 때문에

다시 복원된 결과가 map2가 됩니다.


2. 지역변수 일 경우, 

depth1, depth2에서 별도의 저장소가 생기고 거기에 map1, 2가 저장되고 이것으로 복원하니까 위와 같은 문제 없이

정상 복원이 가능합니다.


YUBgorithm   6년 전

감사합니다!! 이해가 쏙쏙되네요

댓글을 작성하려면 로그인해야 합니다.