coding/JS

재귀함수 recursion Function

JIN_Coder 2022. 12. 20. 20:04

재귀 함수
함수가 직접 또는 간접적으로 자신을 호출하는 함수

필수 조건
재귀 함수는 끝나는 지점(종단점)을 설정해주어야 하고, 매번 다른 인풋 값이 들어갈 수 있도록 해야 함

주의할 점
종단점 미설정(무한 루프에 빠짐)
잘못된 값을 반환, 반환을 하지 않음(같은 인풋 값이 들어가서 무한루프에 빠짐)

 

 

// n부터 카운트다운 하는 함수

function consoleN(n) {
  if (n === 0) {   // 끝내는 조건
    console.log("done!");
    return;
  }
  console.log(n);
  n--;   // 매번 다른 인풋값
  consoleN(n);   // 자기자신 다시 호출
}

consoleN(3);

/*
3
2
1
done!
*/
// n까지 숫자의 합

function sumN(n) {
  if (n === 1) return 1;   // 종단점 설정
  return n + sumN(n - 1);   // 다른 인풋값으로 자기자신 호출
}

console.log(sumN(3));   // 6
console.log(sumN(4));   // 10
// n까지 숫자의 곱

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

console.log(factorial(3));   // 6
console.log(factorial(5));   // 120

 

 

helper 메서드 재귀
재귀적이지 않은 외부 함수가 재귀적인 내부 함수를 호출하는 패턴
일종의 결과를 컴파일할 때 흔히 사용되는 패턴
결과는 보통 배열 같은 데이터 구조

재귀 시 result가 재할당 되는 것을 방지하기 위해서
1. 스코프 밖에서 result 정의 후 재귀 함수를 사용하는 방법,
2. 함수 안에 재귀 함수를 정의하여 result 값을 찾아가는 방법

 

Ex) 배열에서 홀수 값을 찾아 새로운 배열로 출력

// 올바르지 않은 재귀함수 사용

function odd(arr) {
  let result = [];   // 재귀함수안에서 result 정의시 매번 []로 할당되는 문제 발생
  if (arr.length === 0) return;
  if (arr[0] % 2 !== 0) {
    result.push(arr[0]);
  }
  console.log(result);
  odd(arr.slice(1));
  return result
}

odd([1, 2, 3, 4, 5, 6]);

/*
[ 1 ]
[]
[ 3 ]
[]
[ 5 ]
[]
*/

console.log(result)   // [1]
// 재귀함수 밖에서 result 정의

let result = [];   // 스코프 밖에서 result 정의
function odd(arr) {
  if (arr.length === 0) return;
  if (arr[0] % 2 !== 0) result.push(arr[0]);
  console.log(result);
  odd(arr.slice(1));
}

odd([1, 2, 3, 4, 5, 6]);

/*
[ 1 ]
[ 1 ]
[ 1, 3 ]
[ 1, 3 ]
[ 1, 3, 5 ]
[ 1, 3, 5 ]
*/

console.log(result)   // [ 1, 3, 5 ]
// 함수안에 result를 정의한다면 내부에 재귀함수를 정의(helper 메소드 재귀)

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

  // 내부에 재귀 함수를 정의하고 호출함
  function helper(arr) {
    if (arr.length === 0) return;
    if (arr[0] % 2 !== 0) {
      result.push(arr[0]);
    }
    helper(arr.slice(1));
  }

  helper(arr);
  console.log(result);
  return result;
}

odd([1, 2, 3, 4, 5, 6]);   

// [ 1, 3, 5 ]

'coding > JS' 카테고리의 다른 글

js reduce()  (0) 2022.12.19
.prettierrc 설정  (0) 2022.09.01
소수점 반올림  (0) 2022.08.30
supertest 테스트 코드 작성  (0) 2022.08.11
jest 테스트 코드 작성 방법  (0) 2022.08.11