피보나치 수열(Fibonacci numbers)

2024. 3. 17. 15:58· 알고리즘/자료구조
목차
  1. 피보나치 수열(Fibonacci numbers)이란?
  2. 피보나치 수열 구현 방식
  3. 1. 반복문(Loop)
  4. 2. 재귀 함수(Recursive Function)
  5. 3. 동적 계획법(Dynamic Programming)

피보나치 수열은 다양한 알고리즘에서 사용되며 재귀의 좋은 예시를 제공합니다. 해당 포스팅을 통해 피보나치의 수열을 이해하고 활용 방법에 대해 정리하려고 합니다.

 

피보나치 수열(Fibonacci numbers)이란?


이전 두 항의 합이 다음 항이 되는 수열을 의미합니다. 첫 번째와 두 번째 항이 1이고, 세 번째 항부터는 이전 두 항의 합으로 이루어지는 규칙을 따릅니다.

피보나치 수열의 첫 번째 항은 f(0), 두 번째 항을 f(1)으로 정의합니다.

  • f(0) = 1
  • f(1) = 1

이때 n번 째 항은 (n - 1)번째 항 + (n - 2)번째 항입니다.

  • f(n) = f(n-1) + f(n-2)

피보나치 수열의 첫 번째 항부터 순서대로 예시를 본다면 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ... 로 구성됩니다.

 

즉 정리하면 피보나치 수열의 연산식은 다음과 같습니다.

f(0) = 0, f(1) = 1 일 때
f(n) = f(n - 1) + f(n - 2) 단, (n ≥ 2) 일 경우
더보기
💡 피보나치 수열 예시
예시로 n이 3이라면 f(n - 1) + f(n - 2)로 정의됩니다.
 ・ f(3) = f(3 - 1) + f(3 - 2)
 ・ f(3) = f(2) + f(1)
 ・ f(3) = 1 + 1
 ・ f(3) = 2
만약 n이 4일 경우 f(3) + f(2) 임으로 2 + 1 = 3이 됩니다.

 


 

피보나치 수열 구현 방식


피보나치 수열을 구현하는 방식은 주로 3가지로 나뉩니다. 반복문, 재귀 함수, 동적 계획법입니다. 각각의 방식은 피보나치 수열을 다른 방식으로 접근하며, 각각의 장단점이 있습니다.

구현 방식 장점 단점
반복문 메모리 사용량을 최소화하며, 일정 크기 내에서 연산이 효율적이다. 크기가 큰 경우 연산 속도가 많이 소요된다.
재귀 함수 코드가 간결하여 이해하기 쉽다. 재귀 호출로 인한 중복 연산으로 효율성이 떨어지며, 스택 오버플로우가 발생할 가능성이 있다.
동적 계획법 중복되는 연산을 피하여 효율성이 높다. 다른 방식에 비해 메모리 사용량이 높다. 

 

1. 반복문(Loop)


반복문을 활용하여 피보나치 수열을 계산합니다. 이전 항들을 반복적으로 계산하여 현재 항을 구하는 방식으로 과정은 다음과 같습니다.

  1. 첫 번째 항과 두 번째 항은 모두 1이므로, n ≤ 2인 경우 1을 반환합니다.
  2. 세 번째 항부터 반복문을 순회하며 n번째 항까지 계산합니다.
  3. 현재 항(n)은 이전 두 항(n -1, n-2)의 합으로 계산되며, 계산된 값은 이정 항들의 값을 경신하여 다음 항을 계산할 수 있도록 합니다.

            
public static int fibonacci(int n) {
if (n <= 2) {
return 1;
}
int answer = 0;
int prev1 = 1;
int prev2 = 1;
for (int i = 2; i < n; i++) {
answer = prev1 + prev2;
prev1 = prev2;
prev2 = answer;
}
return answer;
}

 

2. 재귀 함수(Recursive Function)


재귀적 정의에 따라 함수를 호출하여 계산합니다. 즉 함수 자신을 재호출하는 방식입니다.

  1. 첫 번째 항과 두 번째 항은 모두 1이므로, n ≤ 2 인 경우 1을 반환합니다.
  2. 그 외의 경우 현재 항을 이전 두항의 합으로 계산하기 위해 재귀 호출합니다.

            
public static int fibonacci(int n) {
if (n <= 2) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
더보기
💡 재귀 함수(Recursive Function)란?
함수 자기 자신을 호출하는 것을 허용하는 함수입니다. 이는 함수가 어떤 작업을 수행하기 위해 자기 자신을 다시 호출할 수 있으며, 보통 재귀 호출을 통해 작은 문제를 해결하고, 이를 조합하여 더 큰 문제를 해결하는 데 사용됩니다.

재귀 함수는 보통 기저 조건(base case)과 재귀 호출(recursive call)로 이루어져 있습니다. 기조 조건은 함수가 자기 자신을 호출하지 않고 바로 반환하는 경우로, 재귀를 종료시키는 역할을 합니다. 재귀 호출은 함수가 자기 자신을 호출하여 더 작은 입력 값에 대해 작업을 수행하는 것을 의미합니다. 재귀 호출은 입력 값이 점점 작아지며 입력 값이 기저 조건에 부합될 때 종료됩니다.

 

3. 동적 계획법(Dynamic Programming)


동적 계획법은 중복되는 계산을 피하기 위해 이전에 계산한 값을 저장하여 재활용하는 방식입니다.

  1. 재활용이 될 값을 저장하기 위한 배열을 생성합니다.
  2. 첫 번째와 두 번째 항을 1로 초기화하여  기저 조건을 설정합니다.
  3. 반복문을 사용하여 세 번째 항부터 n번째 항까지 계산하여 저장합니다.

            
public static int fibonacci(int n) {
int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 1;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
더보기
💡 동적 계획법(Dynamic Programming)이란?
복잡한 문제를 간단한 여러 하위 문제로 나눠 푸는 방식으로 하위 문제의 해결 방법을 저장하고 재활용하여 전체 문제를 효율적으로 해결합니다. 동적 계획법은 중복 계산 대신 저장된 값을 재활용하기 때문에 효율성이 높습니다.

 


 

자연과 디자인에서 찾을 수 있는 ‘피보나치 수열’에 숨은 황금비!

피보나치(Leonardo Fibonacci, 1170년 추정 ~ 1250년 추정)는 잘 알려진 중세 유럽의 가장 뛰어난 수학자이다. 당시 유럽에서는 산술과 표기(로마자)를 다르게 하는 불편함이 있었으나 피보나치가 새로

news.samsungdisplay.com

 

알고리즘 - Dynamic Programming(동적 계획법)

1. 개요 DP, 즉 다이나믹 프로그래밍(또는 동적 계획법)은 기본적인 아이디어로 하나의 큰 문제를 여러 개의 작은 문제로 나누어서 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용하는 것으로

hongjw1938.tistory.com

'알고리즘 > 자료구조' 카테고리의 다른 글

유클리드 호제법(Euclidean algorithm)  (0) 2024.04.05
우선순위 큐(Priority Queue)  (0) 2024.04.03
  1. 피보나치 수열(Fibonacci numbers)이란?
  2. 피보나치 수열 구현 방식
  3. 1. 반복문(Loop)
  4. 2. 재귀 함수(Recursive Function)
  5. 3. 동적 계획법(Dynamic Programming)
'알고리즘/자료구조' 카테고리의 다른 글
  • 유클리드 호제법(Euclidean algorithm)
  • 우선순위 큐(Priority Queue)
Hui._.
Hui._.
High hope
Hui._.
개발 일기
Hui._.
전체
오늘
어제
  • 분류 전체보기 (57)
    • Java (4)
    • Spring (26)
      • Spring Framework (6)
      • Spring Security (9)
      • JPA (11)
    • CS (2)
    • 알고리즘 (19)
      • 문제풀이 (16)
      • 자료구조 (3)
    • ETC (3)
    • Project (3)
      • Trouble Shooting (3)

블로그 메뉴

  • 홈
  • 글쓰기
  • 설정

공지사항

인기 글

태그

  • Spring Security + JWT + OAuth 2.0
  • 원칙
  • 최소공배수
  • persist
  • 추상화
  • Spring Security 6.1
  • Spring Security
  • 유클리드
  • java
  • 지연
  • 인터페이스
  • 프로그래머스
  • 스프링 시큐리티6.1
  • jpa
  • 스프링 부트3
  • 호제법
  • oauth
  • 회원 기능
  • SOLID
  • 코딩테스트
  • Oauth 2.0
  • dynamic programming
  • HashMap
  • 알고리즘
  • jwt
  • 분리
  • 엔티티
  • 매핑
  • 최대공약수
  • Spring Boot 3.2.3

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hui._.
피보나치 수열(Fibonacci numbers)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.