반응형
#include <stdio.h>
int fib1(int); //재귀형 피보나치 함수(Recursive)
int fib2(int); //반복형 피보나치 함수(Iterative)
void main()
{
int x;
printf("재귀형->1\n반복형->2\n입력:");
scanf("%d", &x);
int n;
printf("\n몇번째항?\n입력:");
scanf("%d", &n);
switch (x)
{
case 1: //재귀
{
int a = fib1(n);
printf("%d \n", a);
break;
}
case 2: //반복
{
unsigned int b = fib2(n);
printf("%d\n", b);
break;
}
}
}
int fib1(int n) //재귀형 피보나치 함수(Recursive)
{
/*재귀하면서 같은 값을 반복하여 계산하게 된다.(점점 가짓수가 늘어남) 값이 늘어날수록 계산해야할 값이 점점 많아져서 느리다.*/
if (n <= 1)
return n;
else
return fib1(n - 1) + fib1(n - 2);
}
int fib2(int n) //반복형 피보나치 함수(Iterative)
{
/*계산을 반복할때마다 가장가까운 2개 항만 사용하기때문에 빠르다.*/
unsigned int a1 = 0;
unsigned int a2 = 1;
unsigned int temp; //구하고싶은 항의 값을 저장할 변수
if (n == 0)
return a1;
else if (n == 1)
return a2;
else
{
for (int i = 2; i <= n; i++)
{
temp = a1 + a2; //전항과 전전항을 더한다.
a1 = a2; //전항값을 전전항에,
a2 = temp; //구한값을 전항에 넣는다.
}
return temp;
}
}
반복형 - temp 변수 없이 변수 2개로 하는 방법
else
{
for (int i = 2; i <= n; i++)
{
if (i % 2 == 0)
a1 = a1 + a2;
else
a2 = a1 + a2;
}
}
if (a1>a2)
return a1;
else
return a2;
반응형