문제
다음 C 코드의 실행 결과를 쓰시오.
C#include <stdio.h> typedef struct { int x, y; } Point; void func(Point p, int depth) { if (depth <= 0) return; p.x += depth; p.y *= 2; if (depth % 3 == 0) { func((Point){p.x - 1, p.y + depth}, depth - 2); printf("%d ", p.x + p.y); func((Point){p.x + 2, p.y - 1}, depth - 3); } else { printf("%d ", p.x * p.y); func((Point){p.x / 2, p.y + 3}, depth - 1); } } int main() { Point start = {1, 2}; func(start, 4); return 0; }
정답
20 170 19
20 170 1920 170 192017019
해설
① func({1,2}, 4): depth=4이므로 p=(5,4). 4%3≠0 → else 분기에서 5×4 = 20 출력 후 func({2,7}, 3) 호출. ② func({2,7}, 3): depth=3이므로 p=(5,14). 3%3==0 → if 분기 진입. printf 전에 func({4,17}, 1)을 먼저 호출. ③ func({4,17}, 1): depth=1이므로 p=(5,34). 1%3≠0 → else 분기에서 5×34 = 170 출력. 이후 func({2,37}, 0) → 즉시 리턴. ②로 복귀: printf 실행 → 5+14 = 19 출력. 이어서 func({7,13}, 0) → 즉시 리턴. 따라서 출력 순서는 20 170 19입니다. 핵심은 depth%3==0일 때 재귀 호출이 printf 앞에 위치하므로, 재귀가 먼저 실행된 뒤 현재 값이 출력된다는 점입니다.