문제
다음 C 코드의 실행 결과를 쓰시오.
C#include <stdio.h> typedef struct { int val; char op; } Data; int calc(Data d, int n) { if (n <= 1) { printf("%d ", d.val); return d.val; } if (d.op == '+') { d.val += n; d.op = '*'; int left = calc(d, n-2); printf("%c", d.op); d.val -= 1; int right = calc((Data){d.val * 2, '-'}, n-3); return left + right; } else { d.val = d.val * 2 - n; printf("%d ", d.val); return calc((Data){d.val + 3, '+'}, n-1); } } int main() { Data start = {3, '+'}; calc(start, 5); return 0; }
정답
8 *2 *-2
8 *2 *-2 8*2*-28 * 2 * -2
해설
[구조체와 재귀 함수 분석]
1단계: calc({3,'+'}, 5)
- d.op == '+' 조건 만족
- d.val = 3 + 5 = 8, d.op = '*'
- left = calc({8,'*'}, 3) 호출
2단계: calc({8,'*'}, 3)
- d.op != '+' (else 분기)
- d.val = 8 * 2 - 3 = 13
- printf("%d ", 13) → 출력: "13 "
- calc({16,'+'}, 2) 호출 (13+3=16)
3단계: calc({16,'+'}, 2)
- d.op == '+' 조건 만족
- d.val = 16 + 2 = 18, d.op = '*'
- left = calc({18,'*'}, 0) 호출
4단계: calc({18,'*'}, 0)
- n <= 1 종료 조건
- printf("%d ", 18) → 출력: "18 "
- return 18
3단계 복귀
- printf("%c", '') → 출력: ""
- d.val = 18 - 1 = 17
- right = calc({34,'-'}, -1) 호출
5단계: calc({34,'-'}, -1)
- n <= 1 종료 조건
- printf("%d ", 34) → 출력: "34 "
- return 34
2단계 복귀
- calc({16,'+'}, 2)의 반환값과 연산 수행
1단계 복귀
- printf("%c", '') → 출력: ""
- 최종 right 계산 후 음수 값 출력
**최종 출력: "8 2 -2 "