[알고리즘] 재귀함수

2022. 11. 14. 23:56·개발/알고리즘
728x90
반응형

1. 재귀함수

(1) 재귀함수란?

 - 재귀함수란 자기자신을 호출하는 함수이다.

(2) 재귀의 기본요소

 - 종료조건

 - 매번 다른 입력값

(3) 재귀의 위험요소

 - 종료조건이 없는경우 : 계속 반복

 - return을 하지 않은 경우

 - 스택 오버플로우 : 재귀호출이 멈추지 않는 경우

2. 콜스택 예시

function takeShower() {
  return "Showering!";
}

function eatBreakfast() {
  let meal = cookFood();
  return `Eating ${meal}`;
}

function cookFood() {
  let items = ["Oatmeal", "Eggs", "Protein Shake"];
  return items[Math.floor(Math.random() * items.length)];
}
function wakeUp() {
  takeShower();
  eatBreakfast();
}

wakeUp();

콜백 형식으로 함수들을 사용한다.

3. 재귀 예시

(1) 1씩 뺀값을 나타내기

 - for문 활용

function countDown(num){
    for(var i = num; i > 0; i--){
        console.log(i);
    }
    console.log("All done!")
}

 - 재귀 활용

function countDown(num){
    if(num <= 0) {
        console.log("All done!");
        return;
    }
    console.log(num);
    num--;
    countDown(num);
}

(2) 0부터 받은 파라미터까지 순서대로 모든 숫자의 합 구하기

function sumRange(num){
   if(num === 1) return 1; 
   return num + sumRange(num-1);
}

(3) 팩토리얼 구현

- for문 활용

function factorial(num){
    let total = 1;
    for(let i = num; i > 1; i--){
        total *= i
    }
    return total;
}

- 재귀 활용

function factorial(num){
    if(num === 1) return 1;
    return num * factorial(num-1);
}

(4) 받은 배열에서 홀수만 더하기

 - helper(다른함수)를 사용하여 함수안에서 helper 함수로 재귀함수를 구현했다.

function collectOddValues(arr) {
  let result = [];

  function helper(helperInput) {
    if (helperInput.length === 0) {
      return;
    }

    if (helperInput[0] % 2 !== 0) {
      result.push(helperInput[0]);
    }

    helper(helperInput.slice(1));
  }

  helper(arr);

  return result;
}

- 일반 재귀

function collectOddValues(arr){
    let newArr = [];
    
    if(arr.length === 0) {
        return newArr;
    }
        
    if(arr[0] % 2 !== 0){
        newArr.push(arr[0]);
    }
        
    newArr = newArr.concat(collectOddValues(arr.slice(1)));
    return newArr;
}

(5) 배열안의 값들을 모두 곱하기

function productOfArray(arr) {
  if (arr.length === 0) return 1;
  return arr[0] * productOfArray(arr.slice(1));
}

(6) 피보나치

function fib(n) {
  if (n <= 2) return 1;
  return fib(n - 1) + fib(n - 2);
}

 

728x90
반응형

'개발 > 알고리즘' 카테고리의 다른 글

[알고리즘] 선형검색, 이진검색  (0) 2022.11.15
[알고리즘] 재귀함수 문제 모음  (31) 2022.11.15
[알고리즘] 문제 모음  (0) 2022.11.02
[알고리즘] 연속된 수를 더해서 가장 큰 값 찾기  (1) 2022.11.02
[알고리즘] 배열에 중복되지 않는 요소 개수 찾기  (0) 2022.11.02
'개발/알고리즘' 카테고리의 다른 글
  • [알고리즘] 선형검색, 이진검색
  • [알고리즘] 재귀함수 문제 모음
  • [알고리즘] 문제 모음
  • [알고리즘] 연속된 수를 더해서 가장 큰 값 찾기
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    30일챌린지
    mysql
    컨테이너
    도커
    html
    erc20
    프로그래머스
    CSS
    React
    하이퍼레저
    ERC721
    블록체인
    js
    go
    go언어
    nodejs
    30일 챌린지
    node.js
    명령어
    node
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[알고리즘] 재귀함수
상단으로

티스토리툴바