자바스크립트의 재귀함수 - Lee-hyuna/33-js-concepts-kr GitHub Wiki
원문: https://www.freecodecamp.org/news/recursion-in-javascript-1608032c7a1f/
'재귀'를 접하는 일을 너무 화나는 일이다. 재귀를 정말 잘 이해한다면 자바스크립트 프로그래밍에 많은 도움이 될 것이다.
안녕, 얼간이. 재귀 좋아한다고 해서 "안녕, 얼간이. 재귀 좋아하신다고 해서 '안녕, 얼간이...
느슨하게 정의된 재귀는 큰 문제를 안고 같은 문제의 작은 여러 인스턴스로 세분화하는 과정이다.
실제로, 일반적으로 자신을 부르는 함수를 쓰는 것을 의미한다. 이 개념의 가장 고전적인 예는 요인 함수인 것이다.
수학 수업에서 숫자 n의 계수는 n보다 작거나 같은 모든 양의 정수의 산물이다. 즉, 팩토리얼 5는 5 x 4 x 3 x 2 x 1
입니다. 이것에 대한 수학 표기법은 5!입니다.
JavaScript에서 이 내용을 작성하는 방법은 다음과 같다.
만약 혼란스럽게 보인다면, factorial(3
)의 예를 사용하여 코드를 살펴보는 것을 권장한다.
필요한 경우에 대비하여 다음과 같은 도움이 있다.
- factorial(3) is 3 x factorial(2).
- factorial(2) is 2 x factorial(1).
- factorial(1) 조건을 충족시키면 결과는 1.
여기서 중요한 점은 call stack을 1로 줄이고 나서 stack을 풀고 있다는 것이다. 콜 스택을 풀면 각 결과를 곱한다. 1 x 2 x 3은 6이고, 반환 값이 된다.
Reversing A String
최근 인터뷰에서 물어본 화이트보드 질문에 대해 얘기했는데, 저는 그게 좀 재미있는 문제라고 생각했다.
만약 당신이 야심찬 사람이라면, 당신이 몇 분 동안 이 문제를 스스로 해결하도록 권하고 싶다. 재귀의 핵심 원칙, 즉 큰 문제를 안고 작은 문제들로 세분화하는 것을 명심하시오.
코드를 풀다 문제가 생긴다면 해결책은 다음과 같다.
문제를 풀다 막힐 경우를 대비하여 간단한 실례를 들어 보자. reverse('bar')
를 출발점으로 하자.
- reverse(‘bar’) is reverse(‘ar’) + ‘b’
- reverse(‘ar’) is reverse(‘r’) + ‘a’
- reverse(‘r’) meets our if condition, so it’s just ‘r’
콜스택이 끝나고 난 후에 ‘r’ + ‘a’ + ‘b’가 된다.
Writing a Recursive Map Function
마지막 예를 위해 map() 함수를 작성하여 다음과 같이 사용할 수 있다.
- map() 항상 새로운 배열을 리턴한다.
- 문제를 작은 단위로 나눈다.
- reverse()를 예로든다.
그럼 앞서 말씀드린 예를 사용해서 이 과정을 진행해보도록 하겠습니다.
- [ ‘a’, ‘b’, ‘c’ ] 배열을 map()으로 호출한다
- 새로운 배열을 만들고 fn('a')를 호출한다
- [ ‘A’ ].concat( map([ ‘b’, ‘c’ ]) ) 리턴한다
- Repeat steps 1 through 3 with [ ‘b’, ‘c’ ]
- Repeat steps 1 through 3 for [ ‘c’ ]
- 결국 빈 배열을 이용하여 map()을 호출하면 재귀가 종료된다.