자료구조
자료구조 - 순환
tita
2024. 6. 6. 13:48
[순환]
순환(재귀, Recursion)은 함수가 자기 자신을 호출하는 프로그래밍 기법입니다. 재귀는 문제를 작은 하위 문제로 나누어 해결하며, 각 하위 문제는 원래 문제와 유사한 구조를 가집니다. 재귀 함수는 보통 종료 조건(base case)을 가지고 있으며, 이 조건이 충족되면 재귀 호출을 멈춥니다.
코드 예시를 보겠습니다.
#include <iostream>
// 재귀적으로 팩토리얼을 계산하는 함수
int factorial(int n)
{
if (n <= 1)
{ // 종료 조건
return 1;
}
else
{
return n * factorial(n - 1); // 재귀 호출
}
}
int main()
{
int number = 5;
std::cout << "팩토리얼 " << number << " = " << factorial(number) << std::endl;
return 0;
}
[반복 (Iteration)]
반복(Iteration)은 루프(반복문)를 사용하여 동일한 작업을 여러 번 수행하는 프로그래밍 기법입니다. 반복문은 일반적으로 for, while, do-while과 같은 구조를 사용하여 구현됩니다.
그리고 대부분의 경우 순환과 반복은 서로 변경이 가능합니다.
우의 순환 팩토리얼 코드를 반복으로 바꿔보겠습니다.
#include <iostream>
// 반복적으로 팩토리얼을 계산하는 함수
int factorial_iterative(int n)
{
int result = 1;
for (int i = 1; i <= n; ++i)
{
result *= i;
}
return result;
}
int main()
{
int number = 5;
std::cout << "팩토리얼 " << number << " = " << factorial_iterative(number) << std::endl;
return 0;
}
[순환과 반복 차이점]
- 구현 방식: 재귀는 함수 호출을 통해 작업을 수행하며, 반복은 루프를 사용합니다.
- 성능: 재귀는 함수 호출 스택을 사용하기 때문에, 반복에 비해 메모리 사용량이 많고, 깊은 재귀 호출의 경우 스택 오버플로우가 발생할 수 있습니다. 반복은 비교적 메모리 효율적입니다.
- 가독성: 재귀는 문제를 분할하여 해결하는 자연스러운 방식을 제공하지만, 이해하기 어려울 수 있습니다. 반복은 직관적이며 이해하기 쉬운 경우가 많습니다.
추가적으로 피보나치 수열의 계산하는 프로그램을 순환과 반복으로 구현해보겠습니다.
<순환>
#include <iostream>
// 재귀적으로 피보나치 수를 계산하는 함수
int fibonacci_recursive(int n)
{
if (n <= 1)
{ // 종료 조건
return n;
}
else
{
return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2); // 재귀 호출
}
}
int main()
{
int number = 10;
std::cout << "피보나치 " << number << " = " << fibonacci_recursive(number) << std::endl;
return 0;
}
<반복>
#include <iostream>
// 반복적으로 피보나치 수를 계산하는 함수
int fibonacci_iterative(int n)
{
if (n <= 1)
{
return n;
}
int a = 0, b = 1, c;
for (int i = 2; i <= n; ++i)
{
c = a + b;
a = b;
b = c;
}
return b;
}
int main()
{
int number = 10;
std::cout << "피보나치 " << number << " = " << fibonacci_iterative(number) << std::endl;
return 0;
}