문제
다음 C 코드의 실행 결과를 쓰시오.
C#include <stdio.h> struct Node { int data; int level; }; int calc(struct Node n, int depth) { if (n.data <= 1) { printf("%d ", n.level + depth); return n.level; } struct Node left = {n.data / 2, n.level + 1}; struct Node right = {n.data - 2, n.level + 1}; int result = calc(left, depth + 1) + calc(right, depth + 1); printf("%d ", result); return result; } int main() { struct Node start = {5, 0}; calc(start, 0); return 0; }
정답
4 4 4 4 4 4 8
4 4 4 4 4 4 84,4,4,4,4,4,84 4 4 4 4 4 8
해설
재귀 호출 순서를 정확히 추적하면:
-
calc({5,0}, 0) 시작
- left = {2, 1}, right = {3, 1}
- calc({2,1}, 1) 먼저 호출
-
calc({2,1}, 1) 처리
- left = {1, 2}, right = {0, 2}
- calc({1,2}, 2) 호출: data≤1이므로 level+depth = 2+2 = 4 출력, return 2
- calc({0,2}, 2) 호출: data≤1이므로 level+depth = 2+2 = 4 출력, return 2
- result = 2+2 = 4, 4 출력 후 return 4
-
calc({3,1}, 1) 처리
- left = {1, 2}, right = {1, 2}
- calc({1,2}, 2) 호출: data≤1이므로 level+depth = 2+2 = 4 출력, return 2
- calc({1,2}, 2) 호출: data≤1이므로 level+depth = 2+2 = 4 출력, return 2
- result = 2+2 = 4, 4 출력 후 return 4
-
calc({5,0}, 0) 완료
- result = 4+4 = 8, 8 출력 후 return 8
따라서 printf 출력 순서는: 4 4 4 4 4 4 8