• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

11분 코드 질문

23.08.02 17:12 작성 조회수 158

1

안녕하세요 하기 코드 질문드립니다

int sumTo(int sumto)

{

if (sumto <= 0)

return 0;

else if (sumto <= 1)

return 1;

else

return sumTo(sumto - 1) + sumto;

}

에서 굵게 표시한

if(sumto < = 1) return 1; 이 굳이 필요한 부분인가요?

~return 0은 재귀함수 중단을 위해 꼭 필요한 것이란 걸 알겠습니다만

~return 1은 어떤 이유에서 추가하셨는지 궁금해서 여쭤봅니다.

 

미리 답변 감사드립니다.

답변 1

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2023.08.02

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

말씀하신 내용처럼 if (sumTo <= 1) return 1; 코드 라인이 없어도, 함수는 여전히 숫자 n 에 대하여 1 부터 n 까지의 모든 정수의 합을 반환합니다. 즉, 해당 조건이 없어도 목표하는 결과를 얻을 수 있는 것은 맞습니다.

하지만, 해당 코드를 추가하면 재귀 함수의 성능이 향상되고, 호출 수를 줄일 수 있습니다.
특히, sumto 의 값이 1 일 때 입니다.
sumto1 이면, 위 코드 라인이 존재함으로 인해 재귀가 즉시 중단되고 1 을 반환합니다.
만약, 해당 코드 라인이 없다면, 함수는 sumto0 이 될 때 까지 한 단계 더 재귀 호출을 진행해야 합니다.

재귀 함수에서 재귀 호출의 수를 줄이는 것은 중요합니다.

재귀 함수는 호출 될 때마다, '스택' 이라는 메모리 영역에 새로운 함수 프레임을 추가하는데요. (강의 7.10 스택과 힙 the stack and the heap 참고)
프로그램의 스택 공간은 제한적이기 때문에, 너무 많은 재귀 호출이 이루어져서 이 공간을 초과한다면, '스택 오버플로우' 라는 에러가 발생하게 됩니다.

따라서, 재귀 함수를 사용하실 때에는 항상 추가적인 재귀 호출을 방지하고, 성능 향상과 스택 오버플로우를 방지하는 것에 신경쓰는 것이 중요합니다.

이이님의 프로필

이이

질문자

2023.08.03

친절한 답변 감사합니다^^.