재귀함수를 만들 때, 꼭 집고 넘어가야하는 부분.
- 탈출조건 : 언제 루프를 중지할 것인가(★★★★★)
- 호출
- 문제를 쪼개는 지점을 어떻게 정할 것인가(분기점)
- 예외 처리
- 결과
- 값을 반환하는 return문 위치 (명시하지 않으면 undefined 리턴)
- 모든 경우의 수를 따지고 있는가? (return 문으로 인한 즉시 중단 대처)
재귀의 베이스(base case)
재귀 단계(recursive case = recursive step)
일반적인 재귀함수 템플릿
function recursive(input1, input2, ...) {
// 재귀의 기초 (base case)
if (문제를 더 이상 쪼갤 수 없을 경우) {
return 단순한 문제의 해답;
}
// recursive Case
// 그렇지 않은 경우
return 더 작은 문제로 새롭게 정의된 문제
// 예1. someValue + recursive(input1Changed, input2Changed, ...)
// 예2. someValue * recursive(input1Changed, input2Changed, ...)
}
// 팩토리얼(n!) 재귀함수
function factorial(n){
if ( n === 0 ) {
return 1
}
return n * factorial(n-1)
}
// 조건부 연산자를 활용한 축소코드
function factorial(n){
return n ? n * factorial(n-1) : 1;
}
꼬리재귀(return문에서의 연산→for문이 돌아가는 방식)
참조사이트
function repeatString(num,acc){
if ( num === 0 ) {
return acc;}
return repeatString(num-1,acc+num)}
작성예정
6) 하노이의 탑 재귀 (js tower of hanoi in recursion)
7) 조합 재귀함수 (js combination in recursion)
참조사이트
//recursion-print-array in javascript
var recursive_function = function(array){
if(array.length === 0){
return [];
}
return array[0] + "\n" + recursive_function(array.slice(1))
}
recursive_function(['1','2','3']);
> "1
2
3
"
// shift로도 가능하다
var recursive_function = function(array){
if(array.length === 0){
return [];
}
return array.shift() + "\n" + recursive_function(array)
}
// 다른방법
var recursive_function = function(array){
if(array.length === 0){
return [];
}
console.log(array.shift());
if(array.length !==0){
recursive_function(array)
}
}
참조사이트