자기 자신을 재호출하는 함수를 말한다. 보통 트리 구조에 대한 알고리즘을 작성할 때 유용하며, 그 외에 여러 가지로 활용할 수 있다.
// 일반 조건/반복문 활용 예제
function factorial(num)
{
// If the number is less than 0, reject it.
if (num < 0) {
return -1;
}
// If the number is 0, its factorial is 1.
else if (num == 0) {
return 1;
}
let tmp = num;
while (num-- > 2) {
tmp *= num;
}
return tmp;
}
let result = factorial(8);
document.write(result);
// Output: 40320
// Recursion 활용 예제
function factorial(num)
{
// If the number is less than 0, reject it.
if (num < 0) {
return -1;
}
// If the number is 0, its factorial is 1.
else if (num === 0) {
return 1;
}
// Otherwise, call this recursive procedure again.
return (num * factorial(num - 1));
let result = factorial(8);
document.write(result);
// Output: 40320
양쪽 모두 동작하는데 문제가 없고 결과값 또한 같기 때문에, 단순한 패턴으로 반복되는 연산 예제에서는 Recursion을 사용함으로써 얻을수 있는 이점이 돋보이지 않는다.
// 일반 조건/반복문 활용 예제
function multiDimensionalArray(target){
let result = []
// target의 길이 만큼 반복
for(let i = 0; i < target.legnth; i++){
// target의 i가 배열인지 확인
if(!Array.isArray(target[i)){
// array가 아니라면 result에 push
result.push(target[i])
}else{
for(let j = 0; j < target[i].length; j ++){
if( !Array.isArray(target[i][j])){
result.push(target[i][j])
}
}else{
.
.
.
}
}
}
}
일반적인 방법으로는 depth만큼 for문이 반복 될 것이고 target의 depth 정보가 없다면 해결하기 어렵다.
// Recursion 활용 예제
function multiDimensionalArray(target){
letr result = [];
for(let i = 0 ; i < target.length; i++){
// Array가 아니라면 push
if(!Array.isArray(target[i]))
result.push(target[i])
else{
result = result.concat(array(target[i]))
}
}
return result;
}
다차원 배열을 1차원 배열로 만드는 예제에서는 효율적으로 해결할 수 있다.