재귀함수 답 질문
안녕하세요 강사님. 좋은 강의 잘 듣고 있습니다!
몇가지 궁금증이 생겨 질문드립니다.
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 이렇게만 바꿔도 완전히 결과가 달라지는 것을 볼 수 있죠.
Generic에 대한 질문 있습니다.
0
98
2
2022 버전에 커뮤니티 버전이 없는데 2026 버전으로 해도 무관?
0
207
2
다형성 캐시 문제
0
116
3
.
0
73
1
프로퍼티 강의 질문 있습니다.
0
79
1
이후 커리 질문
0
87
1
static
0
93
2
강의에는 새로운 클래스 파일을 생성하면...
0
72
1
생성자의 이름 선언
0
66
1
9:03 Divide(10 , 3) 부분 질문입니다
0
91
1
깃허브 관련 질문 있습니다.
0
241
1
비쥬얼 스튜디오 업데이트가 된건가요..? 매개변수 오류 관련 질문
0
250
1
C# 시리즈 || C++ 시리즈 자료구조 강의에 대한 질문입니다!
0
307
2
Activator 질문있습니다
0
336
1
이넘 타임 선언 질문
0
351
1
Sort 오름차순, 내림차순
0
323
1
질문 있습니다.
0
250
1
팩토리얼 문제
0
273
1
Sort함수 질문있습니다.
0
266
1
다형성 함수 질문 있습니다.
0
222
1
질문이 있습니다.
0
231
1
섹션2 연습문제 질문입니다.
0
216
1
안녕하세요~서버에 대해 질문이 있습니다.
1
284
1
텍스트 색깔이 제 편집기와 달라서 수강에 어려움이 있습니다ㅜㅜ
0
397
1





