Javascirpt | 재귀함수 (Recursive Functions)

space's pace·2022년 6월 29일
0

Javascript

목록 보기
9/20
post-thumbnail

재귀함수


함수가 자신을 다시 호출하는 구조로 만들어진 함수이다. 재귀함수는 종료조건이 있어야 하며, 종료조건을 설정해주지 않으면 무한 반복을 하게된다. 재귀함수로 작성이 되는 코드는 반복문으로도 작성할 수 있다.

간단하게 팩토리얼을 예문으로 들어보자

🧐 팩토리얼이란?
자기 자신의 수에 1 작은 수를 곱하고 또 1작은 수를 곱하고 해서 1작은 수가 1이 될때까지 곱하는 것이다.

ex) 5! = 5x4x3x2x1
54321 이므로 120이다.


배열의 합계

let totalValue = function(param) {
  let sum = 0;
  for(var loop = param; loop > 0; loop--) {
    sum += loop;
  }
  return sum;
}

console.log(totalValue(5));
// 15

재귀 함수로 작성한 코드

let recurFunc = function(param) {
  return (param > 0) ? (param + recurFunc(param - 1)) : param;
}

console.log(recurFunc(5));
// 15


비동기 프로세스에서 재귀 함수를 사용


api 요청을 한다고 가정해보자.
만약, api 요청을 실패하면 우리는 백엔드에 다시 요청을 한다.
최대 5번 재요청을 한다.

// 요청 횟수
var requestMaxCount = 5;

// url
var urlString = "https://jsonplaceholder.typicode.com/posts/1";

var apiReqest = function(url, count) {
  console.log(`*****${count}번째 요청중*****`);
  if(count > 0) {
    fetch(url)
      .then(function(response) {
        console.log(response);
        // 응답은 받았으나 404 error와 같은 에러일 경우 재요청
        if(response.ok === false) {
          apiReqest(url, count - 1);
        }
      })
      // 에러 발생시 재요청
      .catch(function(error) {
        console.log("error:", error);
        apiReqest(url, count - 1);
      });
  }
}

console.log(apiReqest(urlString, 5));

만약, url이 잘못되었거나 네트워크 에러가 발생할 경우 재요청을 하게 된다.
0번째 요청인 경우 if문 조건에 의해 api 요청을 수행하지 않는다.


단점

재귀 함수의 호출 횟수가 많아질수록 재귀의 깊이가 깊어진다.
즉, 스택의 제한으로 오류가 발생할 가능성이 높다.
자바스크립트 엔진은 재귀의 깊이가 깊은 경우 정상적으로 최적화 불가능하며, 오류가 발생합니다.
이러한 경우 트램폴린(trampoline)스트림(stream) 같은 기법을 사용하여 재귀를 수동으로 최적화할 수 있습니다.



[JavaScript]함수형 프로그래밍 - 재귀(Recursion) |
출처: https://developer-talk.tistory.com/163

profile
블로그 이사 준비중!

0개의 댓글