07. 재귀함수

김선심·2023년 3월 2일
0

JavaScript

목록 보기
17/20

2023.2.25 study

javascript...5주차...
갈길이 멀다...그래도 해야지~ 해야한다...

참고
https://im-developer.tistory.com/102

  1. 재귀함수
  1. 재귀 함수(Recursion)
    -어떤 함수 내부에서 다시 자기 자신을 부르는 함수로 마치 반복문을 돌리듯 자기 자신을 끊임없이 부르다 특정 조건이 되면 빠져나오는 함수이다.
    그래서 꼭 종료지점을 명시해야한다. 그렇지 않을 때 화면이 멈춰버리쥬~

1) 팩토리얼 계산하기 (!)

  • n이 자연수일 때 1 부터, n까지의 모든 자연수의 곱을 의미한다. 팩토리얼은 n!로 표시한다.
function num(n) {
        if(n <= 1){ 
        return n;                               // 종료조건 n 이 1보다 작거나 같으면 n 을 리턴한다
        }                                            // 가장 마지막 수
        return n * num(n-1); 
}
num(5)

//작동 방식 확인.

5 * num(4)                           // save 
5 * 4 * num(3)                    // save
5 * 4 * 3 * num(2)             // save
5 * 4 * 3 * 2 * num(1)       // save
5 * 4 * 3 * 2 * 1                        // 처음에 앞에서부터 숫자가 1까지 생기고 뒤부터 곱해지면서 5까지 간다.
5 * 4 * 3 * 2                             // 1*2 = 2 *3 = 6 *4 = 24 * 5 = 120
5 * 4 * 6 
5 * 24 

120

2) 재귀적 순회

  • 재귀는 재귀적 순회(recursive traversal)를 구현할 때 사용하면 좋다고 한다.

문제 )
let company = {
  sales: [{
    name: 'John',
    salary: 1000
  }, {
    name: 'Alice',
    salary: 1600
  }],

  development: {
    sites: [{
      name: 'Peter',
      salary: 2000
    }, {
      name: 'Alex',
      salary: 1800
    }],

    internals: [{
      name: 'Jack',
      salary: 1300
    }]
  }
};

-회사엔 부서가 있습니다.
-부서에는 여러 명의 직원이 있는데, 이를 배열로 표현할 수 있습니다. sales 부서의 John과 Alice라는 2명의 직원을 배열 요소로 표현해 보았습니다.
-부서는 하위 부서를 가질 수 있습니다. development 부서는 sites와 internals라는 두 개의 하위 부서를 갖습니다. 각 하위부서에도 직원이 있습니다.
-하위 부서가 커지면 더 작은 단위의 하위 부서(또는 팀)로 쪼개질 가능성도 있습니다.
-sites 부서는 미래에 siteA와 siteB로 나뉠 수 있습니다. 이렇게 나눠진 부서가 미래에 더 세분화될 수도 있죠. 미래에 벌어질 일까진 나타내지 않았지만, 이러한 가능성도 있다는 걸 염두에 두어야 합니다.
-자, 이제 모든 임직원의 급여를 더한 값을 구해야 한다고 해봅시다. 어떻게 할 수 있을까요?

let sum = 0;
const companyArr = Object.keys(company)
companyArr.forEach(v => {
  if (Array.isArray(company[v])) {
    company[v].forEach(v2 => sum = sum + v2.salary)
  } else {
    const companyArr2 = Object.keys(company[v])
    companyArr2.forEach(v2 => {
      company[v][v2].forEach(v3 => sum = sum + v3.salary)
    })
  }
})
console.log(sum) 
/// 스터디에서 푼 문제이고

function sumSalaries(department) {
  if (Array.isArray(department)) { // 첫 번째 경우
    return department.reduce((prev, current) => prev + current.salary, 0); // 배열의 요소를 합함
  } else { // 두 번째 경우
    let sum = 0;
    for (let subdep of Object.values(department)) {
      sum += sumSalaries(subdep); // 재귀 호출로 각 하위 부서 임직원의 급여 총합을 구함
    }
    return sum;
  }
}

alert(sumSalaries(company)); // 7700
///이건 모던자바에서 풀이한 내용

forEach(), reduce(), 내용도 차후 추가하도록!!

스터디에서 문제를 풀어보긴 했지만 여전히 무엇이 맞고 틀림보다는 눈으로 이해하지만 타자치는 손은 아직 이해하는데 부족한거 같다.. 그래서..

재귀함수를 이용해서 문제를 풀려고 하니깐 팩토리얼 계산하기 관련된 부분들만 많고 내가 원하는 재귀함수에 대한 내용들이 부족한거 같다. 아직 재귀함수가 확 닿지도 않았기 때문에 재귀함수는 다시 정리하는걸로,,

profile
i can do it

0개의 댓글