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

상인김님의 프로필 이미지
상인김

작성한 질문수

홍정모의 따라하며 배우는 C언어

9.8 팩토리얼 예제

함수와 재귀함수(1)이 가지는 반환값

해결된 질문

작성

·

297

2

#include <stdio.h>

int start;

int loop(int n);

long recursive_factorial(int);

int main()

{

int b = recursive_factorial(5);

printf("your final destination is % d", b);

return 0;

}

long recursive_factorial(int n)

{

if (n != 0)

{

// recursion 함수 : it is called "재귀호출" and tail recurision in english

printf("%d\n", n);

return n * recursive_factorial(n - 1);

}

printf("hki"); // 이 줄 없을때는 그냥 120 출력된다. 그러나 이 줄 추가했더니 뭔가 다르다.

//출력스트링의 길이가 반환값인가? hi 일때 최종값 240, hki일때 최종값 360이네(120씩 증가한다.), 근데 한글은 길이 한 번 늘때마다 240씩 증가하네?

}

 

코드입니다.

팩토리얼 예제를 얼떨결에 직접 풀었지만, 궁금증이 가시지 않아 질문 올립니다.

첫 번째, recursive_factorial(2)는 2 * 동일한 함수의 (1)을 반환값으로 갖습니다. 이때 함수(1)의 반환값은 어찌 되나요?

두 번째, 주석으로 남겨둔 내용의 이유가 궁금합니다.

답변 1

1

안녕하세요, 질문&답변 도우미 Soobak 입니다.

 

#include <stdio.h>

int start;

long recursive_factorial(int);

int main()
{
  int b = recursive_factorial(5);
  printf("your final destination is %d", b);

  return 0;
}

long recursive_factorial(int n)
{
  if (n != 0)
  {
    printf("%d\n", n);
    return n * recursive_factorial(n - 1);
  }
  printf("hki");
}

 

위 코드에서 recursive_factorial(2) 를 호출하면,
n0 이 아니므로, 2 * recursive_factorial(1) 을 계산합니다.

recursive_factorial(1)1 * recursive_factorial(0) 을 계산합니다.

여기서, 문제가 발생합니다.

코드에서 n0 일 때의 반환값을 정해주지 않으셨기 때문에, 함수는 0 일 때 쓰레기 값(메모리 주소에 이미 할당되어 있는 임의의 값)을 반환합니다. 따라서 예상치 못한 행동이 발생하게 됩니다. (출력이 정상적으로 이루어 졌다고 하더라도, 우연인 것입니다.)

따라서, 반환값을 명시해 주셔야 합니다.

 

마지막으로 첨부해주신 printf() 함수의 호출의 경우, recursive_factorial() 함수의 반환값에 영향을 미치지 않습니다.
혹시, 질문자분께서 코드를 첨부하시는 과정 중 return 과 같은 일부 키워드의 누락이 있지는 않으셨는지 확인해주시면 감사하겠습니다.

상인김님의 프로필 이미지
상인김
질문자

printf()안의 글자수에 따라 결과값이 달라지는 것은 몇 번이고 확인한 사실이라 반환값인 줄 알았는데, 아니었나 보네요.. 알겠습니다.

상인김님의 프로필 이미지
상인김

작성한 질문수

질문하기