본문 바로가기
카테고리 없음

알고리즘 점화식(등차수열, 팩토리얼, 피보나치 수열)

by 지삶앎 2022. 8. 14.
반응형

알고리즘, 점화식(등차수열, 피보나치 수열)

점화식(재귀식)

점화식, 재귀식이란 수열에서 이웃하는 두 개의 항 사이에 성립하는 관계를 나타낸 관계식을 말한다.

대표적인 점화식에는 등차 수열, 등비수열, 팩토리얼, 피보나치 수열이 있다.

  • 등차 수열 : F(n) = F(n - 1) + a
  • 등비수열 : F(n) = F(n - 1) * a
  • 팩토리얼 : F(n) = F(n -1 ) * n
  • 피보나치수열 : F(n) = F(n - 1) + F(n - 2)

등차수열

for 반복문을 활용한 등차수열 알고리즘이다.

function forloop(첫항, 공차, N번째){
  let N번째항 = 0;
  
  for(let i =1; i <=N번째; i++){
    if(i === 1){
      N번째항 += 첫항
    } else {
      N번째항 += 공차
    }

  }
	return N번째항
}

forloop(3,2,5) // 11

재귀식으로 간단하게 표현할 수 있는데 다음과 같다.

function recursive(첫째항, 공차, N번째){
  // 멈출 조건
  if(N번째 === 1){
    return s;
  }
  // 반복할 코드
  return recursive(첫째항, 공차, N번째 - 1) + t
  
  // number : 5, recursive(첫째항, 공차, 4) + 2 : 9 + 2
  // number : 4, recursive(첫째항, 공차, 3) + 2 : 7 + 2
  // number : 3, recursive(첫째항, 공차, 2) + 2 : 5 + 2
  // number : 2, recursive(첫째항, 공차, 1) + 2 : 3 + 2
  // number : 1 => 3
}

recursive(3,2,5) // 11

아래는 수학 공식을 가지고 구현한 식이다.

function forloop2(첫항, 공차, N번째){
  let N번째항 = 첫항 + ((N번째 - 1) * 공차)
  return N번째항
}

 

팩토리얼

팩토리얼은 1부터 n까지 곱한 수를 의미한다. 재귀 함수로는 아래와 같이 풀을 수 있다.

let result;

function recursive(number){
  if(number === 1){
    return number
  }
  // 5 4 3 2 1
  return recursive(number - 1) * number
}

recursive(5) // 120

익숙한 for문으로는 아래처럼 풀이될 수 있다.

function solution(n){
  let result = 1
  for(let i=1;i<=n;i++){
    result *= i
  }
  return result
}

solution(5) // 120

 

피보나치 수열

피보나치수열은 첫째 항과 둘째 항의 합이 셋째 항이 된다.

f(n) = f(n-1) + f(n-2)를 의미하며 재귀 함수로 풀 수 있다.

let result;

function recursive(number){
  if(number === 1 | number === 0){
    return number;
  }
  
  //f(n) = f(n-1) + f(n-2)
  return recursive(number - 1) + recursive(number - 2)
  // recursive(4) + recursive(3)
  // recursive(3) + recursive(2) + recursive(2) + recursive(1)
  // recursive(2) + recursive(1) + + recursive(1) + recursive(0) + recursive(1) + recursive(0) + recursive(1)
  //recursive(1) + recursive(0) + recursive(1) + recursive(1) + recursive(0) + recursive(1) + recursive(0) + recursive(1)
}


recursive(5)

 

학습 회고

등차수열, 팩토리얼, 피보나치수열들이 수학식으로는 쉽게 풀었다가 알고리즘으로 풀려니 막혔던 게 많았다. 매번 반복문으로 풀이를 하다가 막혔던 부분들이 많았는데 재귀함수로 더 쉽게 풀 수 있다는 걸 느꼈다. 아직까지 재귀함수가 어색하기 때문에 계속 쓰면서 익숙해져야겠다. 재귀함수에서 가장 중요한 것은 멈추는 식이 있어야 한다는 것! 잊지 말자.

 

이전 글들

2022.08.11 - [분류 전체보기] - 알고리즘, 시간 복잡도와 경우의 수 기본 개념

 

알고리즘, 시간 복잡도와 경우의 수 기본 개념

시간 복잡도 입력 크기의 값에 대해 단위 연산을 몇 번 수행하는지 계산하여, 알고리즘 수행 시간을 평가하는 방법이다. 3가지 표현법으로 빅오, 세타, 오메가가 있다. 빅오 : 최악의 상황을 고려

jm-developer.com

2022.08.11 - [분류 전체보기] - 리액트에 대한 이해, 자바스크립트와 비교

 

리액트에 대한 이해, 자바스크립트와 비교

리액트의 모듈화 기존의 html, css, javascript. 구현해야 하는 기능이 많아지면 script.js 파일 안에 모든 코드를 넣기가 힘들어진다. 이때 여러 개의 css, js 파일로 분리하게 된다. 결국 어떤 방식으로든

jm-developer.com

2022.08.10 - [분류 전체보기] - 스코프와 호이스팅 개념과 예시코드

 

스코프와 호이스팅 개념과 예시코드

스코프(Scope)란? 변수 혹은 상수에 접근할 수 있는 범위를 말한다. 모듈/함수 내 코드에서 동일한 변수 사용 시 간섭을 줄이는 용도로 사용한다. 스코프는 글로벌 스코프와 로컬 스코프의 타입으

jm-developer.com

 

반응형

댓글