인프런 커뮤니티 질문&답변

yuniv님의 프로필 이미지
yuniv

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문

연습 문제

재귀함수 답 질문

해결된 질문

작성

·

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

Rookiss님의 프로필 이미지
Rookiss
지식공유자

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 이렇게만 바꿔도 완전히 결과가 달라지는 것을 볼 수 있죠.

yuniv님의 프로필 이미지
yuniv
질문자

디버깅할 때도 고려해서 코딩해야겠네요!  친절한 답변 감사드립니다!  :) 

yuniv님의 프로필 이미지
yuniv

작성한 질문수

질문하기