#include<iostream>
int sum_down(int x) // 기존에 주어졌던 함수
{
if (x >= 0)
{
x = x - 1;
int y = x + sum_down(x);
return y + sum_down(x);
}
else
{
return 1;
}
}
int sum_down_iterative(int x) // 루프형으로 수정한 함수
{
if (x<0) return 1;
int sum = 1;
for (int i = 0; i <= x; i++)
sum = i - 1 + 2 * sum;
return sum;
}
int main()
{
int sel, input;
while (1)
{
std::cout << "이용할 함수 선택 1. 재귀형 함수 2. 루프형 함수 3. 종료\n";
std::cin >> sel;
std::cout << "계산할 값을 입력 : ";
std::cin >>input;
switch (sel)
{
case 1:
{
std::cout << sum_down(input) <<std::endl << std::endl;
break;
}
case 2:
{
std::cout << sum_down_iterative(input)<< std::endl << std::endl;
break;
}
default:
{
if (sel ==3) std::cout << "프로그램 종료" << std::endl << std::endl;
else std::cout << "함수를 다시 선택하세요" << std::endl<< std::endl;
}
}
if (sel == 3) break;
}
}
이번에 받은 C++ 과제. 솔루션이 없어서 동기 아이들이 과제 제출일 전날에 고생하더라는 후문이 있다.
재귀함수로 짜여진 코드를 분석하는 데에 있어 가장 간편한 사고방식은 역시 고등학교 때에 배운 점화식의 개념과 비교하는 것이 아닌가 싶다. 아니, 사실상 똑같아 보인다. 저번에 풀었던 순열 출력도 마찬가지. n번째 답을 낼 수 있다는 것은 동일한 방식으로 n-1번째 답을 낼 수도 있다는 것이니까.재귀함수는 구현이 직관적이기 때문에 간단히 코드를 연상해낼 수 있다는 장점이 있지만, 입력값이 커짐에 따라 계산 시간이 매우 크게 증가하고, 그에 비례하여 메모리도 많이 사용하는 듯하다. 당연히 그렇겠지. 반면 재귀함수를 단순한 반복 구문으로 바꿔 이용해보니 훨씬 빠르게 동일한 결과값을 얻을 수 있었다. 아무래도 실전에서는 빠르고 자원 소모가 적은 프로그램이 장땡이지 않을까? 아닌 것도 있겠으니, 상황에 따라 적절하게 선택하는 능력이 필요하겠다.
sum_down은 문제에서 제시해줬던 간단한 함수이고, 그 아래에 sum_down_iterative처럼 반복문을 사용한 함수로 변환하는 것이 과제였다. 런타임 도중에 함수를 선택하여 사용할 수 있게 하여 계산 시간 등을 비교 확인해볼 수 있도록 main을 짰다.
참고로 계산 시간의 비교는 n=10에서 +1 해나가면서 비교해보면 두드러지게 비교가 가능하다.
at 2014/10/16 11:18
덧글