4.12 [재귀 함수]

Lee·2023년 4월 12일
0

오.배.이.안& 회고

목록 보기
33/46
post-thumbnail

오배이안 🪙


재귀함수

재귀는
"원래의 자리로 되돌아가거나 되돌아옴" 이라는 뜻을 가지고 있다.

JavaScript 재귀 함수

재귀 함수란

함수 내부에서 자신을 호출하고 있는 함수를 말한다.

예시

function app(){
  console.log('하이')
  app()
  }

재귀 함수를 만들어 보았다.
그리고 콘솔에 호출해보았다

멈,,,멈춰줘,,, 무한으로 하이가 출력되는 것을 볼 수 있다.

그렇다 재귀 함수는 내부에서 자기 자신을 호출하기 때문에 무한루프에 빠지게 되는 것이다.

그래서 재귀 함수를 사용하게 되면 꼭 탈출 조건을 만들어야한다.


저렇게 무한루프 도는 걸 왜 사용함?

재귀 함수를 사용하는 경우를 알아보자

  • 주어진 문제를 비슷한 구조의 더 작은 문제로 나눌 수 있는 경우
  • 중첩된 반복문이 많거나 반복문의 중첩 횟수를 예측하기 어려운 경우

위의 두가지 경우에 사용한다고 한다.


주어진 문제를 비슷한 구조의 더 작은 문제로 나눌 수 있는 경우

예를 들자면 전달인자로 배열을 받는 함수가 있고 이 배열의 합을 리턴하는 함수를 작성해야할때

arr = [1,2,3,4]
arrSum(arr)

arrSum 함수 인자로 배열이 주어진다면 합인 10 을 리턴하는 함수를 구현해야한다.

작은 단위로 하나씩 쪼개보자
결국 1+2+3+4+5 인 것이다.

1 + [2,3,4]
2 +[3,4]
3+[4]
4+[] // 가장 작은 단위로 쪼갬

다 쪼개 놓고 보니 규칙이 존재하는 것을 볼 수 있다.

배열의 첫번째 요소를 pop()으로 빼고 남은 배열을 다시 arrSum(arr) 으로 넣어 재귀 함수를 구현하기

위 와 같이 문제를 가장 작은 단위로 쪼개는 것을 recursive case 라고 한다.

더이상 문제를 쪼갤 수 없는 경우인 [] 빈배열만 남은 경우 를 탈출조건으로 만들어서 재귀 함수의 무한루프를 탈출하자.
탈출 조건을 재귀의 기초(base case) 라고 한다.

코드로 정리해보면

arr = [1,2,3,4]
function arrSum(arr){

// 빈 배열이면 0을 리턴
if(arr.length === 0){
return 0
}

return arr.shift() + arrSum(arr)

base case 는 배열의 길이가 0이면 0을 리턴하는 것이다.

recursive case는 위 코드에서 마지막 리턴문이 될 수 있겠다.


중첩된 반복문이 많거나 반복문의 중첩 횟수를 예측하기 어려운 경우

모든 재귀 함수는 반복문으로 표현할 수 있다. 그러나 재귀 함수를 적용할 수 있는 대부분의 경우에는, 반복문보다 재귀 함수를 적용한 코드가 더욱 간결하고 이해하기 쉽다.


몰랐던 것!

템플릿 리터럴

백틱을 사용해서 문자열을 구성

  • ${} 안에는 또는 이 올 수 있다고 한다.
console.log(`${ [1,2,3,"안뇽"] }`); 
console.log(`${ {a:1, b:2} }`);
console.log(`${ function(){ return 1 } }`); // 정의만 할 경우 
console.log(`${ (function(){ return 1;})() }` + 1); // 호출 후 +1

${}

  • 내부에 배열을 넣게 되면 ===> 대괄호를 없애고 요소들을 하나의 문자열로 인식한다. '1,2,3,안뇽'
  • 객체를 넣게 되면 [object Object] 가 출력된다.
  • 함수를 정의 시에는 그대로 출력

0개의 댓글