종료 조건을 먼저 둔다
재귀가 멈추는 입력 크기와 반환값을 명확히 하지 않으면 무한 호출이 된다.
재귀는 하위 문제를 함수 호출로 표현하고 반복은 상태 변화를 루프로 드러낸다. 종료 조건과 누적 상태가 같으면 서로 변환할 수 있다.
재귀가 멈추는 입력 크기와 반환값을 명확히 하지 않으면 무한 호출이 된다.
인자로 넘길 값, 전역으로 둘 값, 반환으로 받을 값을 분리한다.
입력 크기가 크면 재귀 깊이가 제한을 넘을 수 있어 반복 변환이 필요하다.
// dfs(v): visited[v] = true
// for next in graph[v]: if !visited[next] dfs(next)
// 반복 버전은 call stack을 vector<int> stack으로 바꾼다.