웹사이트 검색

Linux C 프로그래밍 자습서 18부: 재귀 함수


이 페이지에서

  1. 결론

사용하는 프로그래밍 언어에 관계없이 점점 더 코딩을 시작하면 코드를 선명하고 읽기/이해하기 쉽게 만드는 개념을 배우게 됩니다. C에도 이러한 개념이 몇 가지 있습니다. 그 중 하나는 재귀 함수이며, 이 문서에서 잘 논의하고 있습니다.

재귀 함수는 자신을 호출하는 함수입니다. 호출은 함수 본문 내에서 직접 수행하거나 문제의 함수에 의해 호출되는 다른 함수 내에서 간접적으로 수행할 수 있습니다.

다음은 직접 재귀의 예입니다.

int func (int a)
{
//statements

func(a-1);

// statements

return 0;
}

간접 재귀의 예는 다음과 같습니다.

int func (int a)
{
//statements

func_new(a);

// statements

return 0;
}

int func_new(int b)
{
//statements

func(b-1);

//statementsur

return 0;
}

처음에 이미 언급했듯이 재귀는 작성하기 쉬울 뿐만 아니라 이해하고 검토하기 쉬운 간결한 코드를 달성하는 데 도움이 됩니다. 이 이점을 더 명확하게 하기 위해 예를 들어 보겠습니다.

여러분 모두 팩토리얼의 개념에 대해 들어보셨을 것입니다. 잘 모르는 사람들을 위해 계승은 정수에 그보다 작은 모든 양의 정수를 곱할 때 얻는 결과입니다. 예를 들어, 5의 계승은 5x4x3x2x1이며, 이는 120과 같습니다.

다음은 숫자의 계승을 찾는 간단한 코드입니다.

#include <stdio.h>

int main()
{
int a = 0, i = 0, fact = 1;
printf("Enter a number: ");

scanf("%d", &a);

for(i=1; i<=a; i++)
{
fact = fact * i;

}
printf("Factorial of the number is: %d ", fact);
return 0;
}

이 코드는 C 프로그램을 통해 숫자의 계승을 계산하는 방법을 알려주기 위한 것입니다. 프로그램은 생성된 결과의 정확성에 영향을 미칠 수 있는 코너 케이스를 처리하지 않습니다.

따라서 이것은 재귀 함수를 사용하지 않고 숫자의 계승을 계산할 수 있는 많은 방법 중 하나입니다. 이제 재귀를 사용하여 계승을 계산하는 코드를 살펴보겠습니다.

#include <stdio.h>

int factorial (int b)
{
if(!b)
return 1;

return (b * factorial(b-1));
}

int main()
{
int a = 0, fact = 1;
printf("Enter a number: ");

scanf("%d", &a);

fact = factorial(a);

printf("Factorial of the number is: %d ", fact);
return 0;
}

따라서 실제로 계승을 계산하는 함수 계승은 매우 간결합니다. 그리고 주의를 기울이면 매우 이해하기 쉽습니다.

무슨 일이 일어나고 있는지 모르는 사람들을 위해 사용자가 입력한 값, 예를 들어 5는 기본 함수 내에서 처음 호출될 때 factorial 함수에 전달됩니다. 계승 함수 내부에는 입력 값이 0인지 확인하는 검사가 있는데, 함수가 입력 값 5로 처음 호출될 때 참이 아닙니다.

그런 다음 return 문에는 factorial(4)의 반환 값에 5를 곱하는 표현식이 포함됩니다. 이제 factorial 함수가 다시 한 번 실행되고 다음 표현식에 도달합니다. return (4 * factorial(3)). 그런 다음 다시 이러한 단계를 반복합니다.

따라서 광범위하게 살펴보면 이러한 함수 호출이 쌓이는 방법은 다음과 같습니다.

  • 5 * 계승(4)
  • 4 * factortorial(3)
  • 3 * factorial(2)
  • 2 * 계승(1)
  • 1 * 계승(0)

이제 factorial(0)이 실행되면 factorial 함수의 if 조건이 true가 되고 값 1이 반환됩니다. 이제 위에 나열된 호출이 완료되는 방식입니다(이전 목록의 마지막 항목을 이 목록의 첫 번째 항목과 비교하는 등).

  • 1 * 1
  • 2 * (1*1)
  • 3 * (2*(1*1))
  • 4 * (3*(2*(1*1)))
  • 5 * (4 * (3*(2*(1*1))))

이는 사실상 5 * 4 *3 * 2 * 1이고, 이는 5의 계승값인 120입니다.

이것이 재귀 함수가 작동하는 방식입니다. 지금까지 나열한 재귀 함수의 장점에 대해 의심의 여지가 없지만 몇 가지 단점도 있습니다.

예를 들어 위의 예에서 factorial(0) 호출이 완료될 때까지 이전의 모든 계승 호출은 함수 처리가 완료되기를 기다리고 있었습니다. 자동 또는 지역 변수가 각 재귀 호출에 대해 메모리를 차지한다는 사실은 말할 것도 없습니다.

따라서 재귀를 사용할 때 저장 공간을 효과적으로 절약할 수 없습니다. 또한 코드 실행 속도가 더 빠르다는 보장도 없습니다. 재귀 함수의 진정한 이점은 데이터 구조를 다룰 때입니다. 이에 대해서는 나중에 이 진행 중인 C 튜토리얼 시리즈의 일부로 논의할 것입니다.

결론

결론적으로 일상적인 코딩 작업에서 재귀 함수를 자주 사용하지 않을 수 있지만 반드시 알아야 할 중요한 개념입니다. 여기서 언급한 예제를 시도하고 재귀 함수의 개념을 더 잘 이해할 수 있도록 조정하십시오.