백준
10872번 팩토리얼(EAX, 스택프레임) - ☆
조주똥
2020. 7. 10. 23:36
#문제링크 : https://www.acmicpc.net/problem/10872
<전략>
1. 반복문으로 간단히 풀 수 있지만, 재귀호출로 풀었다. 재귀를 사용하게 되면 호출량이 급속도로 증가하기 때문에 시간초과가 날 수 있다. 따라서, 중간중간 이미 계산된 fact(i)을 메모이제이션을 통해 저장해두어야 불필요한 호출을 안할 수 있다.
※주의사항
1. else문에 return값을 넣어주지 않아도 답은 잘나온다. 왜일까? 답은 잘 나오지만, 런타임에러가 뜬다.
2. EAX레지스터는 최근 연산된 값을 저장해놓는다. 또한, 연산 전용 레지스터라 연산이 수행되면 EAX레지스터에서 연산이 수행되고 저장된다.
3. 위 코드를 보면 else문에 return값이 없는데도 잘 출력되는 것을 확인할 수 있다. 정확하진 않지만 아마 10+1연산을 수행하고 EAX에 가장 최근 연산인 10+1 = 11이 저장되어 있고, 연산을 수행하고 복귀주소로 돌아간 후 cout에서 fact(n)을 출력하게 되면 따로 반환값이 없으므로, EAX에 저장되어 있던 가장 최근 연산값을 가져오는 것 같다.