자바스크립트의 재귀함수 - Lee-hyuna/33-js-concepts-kr GitHub Wiki

원문: https://www.freecodecamp.org/news/recursion-in-javascript-1608032c7a1f/

'재귀'를 접하는 일을 너무 화나는 일이다. 재귀를 정말 잘 이해한다면 자바스크립트 프로그래밍에 많은 도움이 될 것이다.

안녕, 얼간이. 재귀 좋아한다고 해서 "안녕, 얼간이. 재귀 좋아하신다고 해서 '안녕, 얼간이...

느슨하게 정의된 재귀는 큰 문제를 안고 같은 문제의 작은 여러 인스턴스로 세분화하는 과정이다.

실제로, 일반적으로 자신을 부르는 함수를 쓰는 것을 의미한다. 이 개념의 가장 고전적인 예는 요인 함수인 것이다.

수학 수업에서 숫자 n의 계수는 n보다 작거나 같은 모든 양의 정수의 산물이다. 즉, 팩토리얼 55 x 4 x 3 x 2 x 1입니다. 이것에 대한 수학 표기법은 5!입니다.

JavaScript에서 이 내용을 작성하는 방법은 다음과 같다.

만약 혼란스럽게 보인다면, factorial(3)의 예를 사용하여 코드를 살펴보는 것을 권장한다.

필요한 경우에 대비하여 다음과 같은 도움이 있다.

  1. factorial(3) is 3 x factorial(2).
  2. factorial(2) is 2 x factorial(1).
  3. factorial(1) 조건을 충족시키면 결과는 1.

여기서 중요한 점은 call stack을 1로 줄이고 나서 stack을 풀고 있다는 것이다. 콜 스택을 풀면 각 결과를 곱한다. 1 x 2 x 3은 6이고, 반환 값이 된다.

Reversing A String

최근 인터뷰에서 물어본 화이트보드 질문에 대해 얘기했는데, 저는 그게 좀 재미있는 문제라고 생각했다.

만약 당신이 야심찬 사람이라면, 당신이 몇 분 동안 이 문제를 스스로 해결하도록 권하고 싶다. 재귀의 핵심 원칙, 즉 큰 문제를 안고 작은 문제들로 세분화하는 것을 명심하시오.

코드를 풀다 문제가 생긴다면 해결책은 다음과 같다.

문제를 풀다 막힐 경우를 대비하여 간단한 실례를 들어 보자. reverse('bar')를 출발점으로 하자.

  1. reverse(‘bar’) is reverse(‘ar’) + ‘b’
  2. reverse(‘ar’) is reverse(‘r’) + ‘a’
  3. reverse(‘r’) meets our if condition, so it’s just ‘r’

콜스택이 끝나고 난 후에 ‘r’ + ‘a’ + ‘b’가 된다.

Writing a Recursive Map Function

마지막 예를 위해 map() 함수를 작성하여 다음과 같이 사용할 수 있다.

  1. map() 항상 새로운 배열을 리턴한다.
  2. 문제를 작은 단위로 나눈다.
  3. reverse()를 예로든다.

그럼 앞서 말씀드린 예를 사용해서 이 과정을 진행해보도록 하겠습니다.

  1. [ ‘a’, ‘b’, ‘c’ ] 배열을 map()으로 호출한다
  2. 새로운 배열을 만들고 fn('a')를 호출한다
  3. [ ‘A’ ].concat( map([ ‘b’, ‘c’ ]) ) 리턴한다
  4. Repeat steps 1 through 3 with [ ‘b’, ‘c’ ]
  5. Repeat steps 1 through 3 for [ ‘c’ ]
  6. 결국 빈 배열을 이용하여 map()을 호출하면 재귀가 종료된다.