카테고리 없음

피보나치 수열 (재귀적, 반복적)

zuyo 2017. 7. 20. 19:07
반응형
#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;


반응형