IT_Programming/C · C++

[C] 피보나치 수열 [ Ver. 재귀 / 비재귀 ]

JJun ™ 2009. 6. 2. 12:20

=================================================================================================

 

[실행화면]

 

=================================================================================================

 

[소스코드]

 

/*   작성자 : creazier (블로그 주인장)                             */

 

#include <stdio.h>

int recursive_fibo(int num);      // 재귀 호출
int nonrecursive_fibo(int size); // 비재귀 호출

 

int main(void)
{
       int i, size;
       printf("출력할 피보나치 수열의 개수를 입력하세요 : ");
       scanf("%d", &size);

 

       printf("재귀 : ");
       for(i=0; i<size; ++i) // 카운팅 반복문
       {
              printf("%d ", recursive_fibo(i));
       }
       printf("\n");
 
       printf("비재귀 : ");
       for(i=0; i<size; ++i) // 카운팅 반복문
       {
              printf("%d ", nonrecursive_fibo(i));
       }
       printf("\n");
 
       return 0;
}

 

int recursive_fibo(int num) // 재귀호출 버전
{
       if(num == 0 || num == 1) // 종료조건 
              return num;
 
       return recursive_fibo(num-1) + recursive_fibo(num-2); // 점화식 : Fn = Fn-1 + Fn-2
}

 

int nonrecursive_fibo(int num) // 비재귀 호출 버전
{
       int x = 0, y = 1, hap = 0, count = 0;

      

       if(num == 0 || num == 1) // 고정된 예외 (시작부분) - 반복문 횟수를 줄이는 목적
              return num;

       if(num == 2)                  // 첫번째, 두번째 수가 정해졌으므로... - 반복문 횟수를 줄이는 목적
              return 1; 
  
       while(++count < num)
       {
              hap = x + y;
              x = y;
              y = hap;
       }

       return y;
}

 

=================================================================================================