해결된 질문
작성
·
233
0
안녕하세요 강사님. 좋은 강의 잘 듣고 있습니다!
몇가지 궁금증이 생겨 질문드립니다.
static int Factorial(int a)
{
if (a == 0)
{
return 1;
}
return (a * Factorial(--a));
}
제가 작성한 코드입니다. 정상적으로 실행은 됩니다만, 몇가지 사소한 궁금증이 있어서 올려봅니다.
1. a==0이 참일때 return 값을 1으로 주는 것보다 n==1이 참일때 return 값을 1로 주는게 더 효율적일까요?(루프를 한번 덜 돌까요?)
2. 강사님께서 if문의 조건식을 n<=1로 작성하셨던데 n==1이 아니고 n<=1로 설정하신 이유가 따로 있을까요?
3. factorial(n-1)부분을 전위 연산자(--a)로 먼저 처리하게 하였는데, 후위연산자를 사용하여 return (a*Factorial(a--))로 하면 return (a*Factorial(a))가 먼저 실행되고 a--가 실행되기 때문에 무한루프를 돈다고 이해했는데 맞을까요? 아니라면 혹시 다른 이유가 있을까요?
답변 1
1
1.
그렇긴 하지만 수학적 정의상 0! = 1이긴 하니, 해당 부분까지 챙기는게 정확하긴 하겠죠.
2.
프로그래밍적인 큰 의미는 없고 0! = 1 케이스까지 챙기려고 그런 것입니다.
3.
네 a--로 하면 Factorial에서 Factorial을 호출하는게
무한으로 타고 가서, 결국 Stack이 터집니다.
(함수를 호출할 때는 돌아갈 곳과 인자를 건내주기 위한 스택 메모리가 필요한데, 이것이 고갈되기 때문)
여담인데 (a*Factorial(--a))이 결과적으로 틀린건 아니지만
a * Factorial(a-1)이 가독성이 더 좋은 일반적인 코드라고 볼 수 있습니다.
가령 나중에 디버깅을 한다고 치면, Factorial(int a)가 호출된 시점의 결과를 보고 싶을 수 있는데
--a 등으로 넘겨받은 인자를 다른 숫자로 바꿔놓는다면, 이런 부분이 조금 보기 어려워지겠죠.
설상 가상으로 a 자체가 값이 바뀐다면
a * Factorial(--a)에서 앞의 a가 어떻게 되는지가 헷갈릴 수가 있습니다.
지금은 a(불변) Factorial(a-1) 형태로 동작하긴 하지만,
만약 Factorial(--a) * a 이렇게만 바꿔도 완전히 결과가 달라지는 것을 볼 수 있죠.
디버깅할 때도 고려해서 코딩해야겠네요! 친절한 답변 감사드립니다! :)