재귀
재귀란, 함수 내에서 어떤 함수를 호출해야하는데 호출 해야하는 함수가 자기 자신일 경우 재귀라고 말함
아래는 제곱근을 구하는 함수를 반복문과 재귀를 이용해서 생성
반복문을 이용한 a를 n번 곱하는 제곱근을 생성
function my_pow(a,n){
let res = 1;
for(let i = 0; i < n; i++){ // 1에 a를 n번만큼 곱해줌
res *= a;
}
return res;
}
console.log(my_pow(2,3)); // 2의3승인 8이 출력
다음은 재귀를 이용한 제곱근을 구하는 함수를 생성
function my_pow(a,n){
if(n === 1)
return 2;
else if(n > 1)
return 2 * my_pow(a,n-1);
}
console.log(my_pow(2,3));
위 코드에서 my_pow 라는 함수는 n === 1 일경우와 n > 1 일경우 두가지로 분기가 나뉨.
n이 1보다 클경우 반복적으로 인자로 받은 n을 -1 해주어서 자기자신을 호출하고 n이 1이 되면 최종적으로 함수 호출을 멈추고 2를 반환.
처음에 n의 값을 3으로 넘겨주었으므로 실행 순서는 아래와 같음
my_pow(2,3) -> return 2 * my_pow(2,2) -> return 2 * my_pow(2,1) -> return 2
위 과정에서 함수의 절차가 함수 실행에 대한 세부 정보를 담고 있는 실행 컨텍스트에 저장됨
실행 컨텍스트에 저장된 절차들을 호출하여 최종적으로 n 을 1로 넘겨주어 2가 리턴되면 다시 역순으로 함수가 반환되어 위에 반복문을 사용한 결과와 동일하게 값이 생성됨
(my_pow(2,1))return 2 -> (my_pow(2,2)) return 2 * 2 -> (my_pow(2,3)) return 2 * 2 *2
처음 호출한 함수를 포함한 중첩된 호출의 개수를 '재귀의 깊이' 라고함. 위 함수의 재귀의 깊이는 n으로 전달한 값 즉 3임.
재귀적 구조
재귀적으로 정의된 자료구조인 재귀적 자료 구조는 자기 자신의 일부를 복제하는 형태의 자료 구조임.
Html 과 Xml 도 재귀적 자료구조의 성격을 띔
연결 리스트
재귀적 자료구조 중 하나인 연결리스트를 사용하면 배열보다 빠르게 데이터를 삽입, 삭제 할 수 있음.
빈번하게 데이터의 삽입과 삭제가 있는 경우에는 배열보다 아래와 같은 연결리스트를 사용하는것이 좋음.
생성할 연결리스트의 프로퍼티 : val, next
- value: 현재의 값이 담긴 프로퍼티
- next: 다음 연결될 리스트를 참조할 프로퍼티
let linkedList = {
value:1,
next:{
value:2,
next:{
value:3,
next:{
value:4,
next:null
}
}
}
}
console.log(linkedList.next)
console.log(linkedList.next.next)
console.log(linkedList.next.next.next)
console.log(linkedList.next.next.next.next)
위 결과와 같이 next에는 다음 연결 리스트의 프로퍼의 참조가 연결되어 있어서 next 프로퍼티를 이용하여 빠르게 참조를 끊고 추가할 수 있음
리스트를 분해
secList = linkedList.next.next;
console.log(secList);
맨 앞에 요소를 추가
linkedList = { value:0, next:linledList };
console.log(linkedList);
중간의 요소를 제거
linkedList.next = linkedList.next.next;
console.log(linkedList);
참조: https://ko.javascript.info/recursion
'JavaScript > JavaScript기초' 카테고리의 다른 글
[Javascript] 데코레이터, 포워딩과 call/apply (0) | 2021.09.27 |
---|---|
[Javascript] setTimeout과 setInterval (0) | 2021.09.24 |
[Javascript] 전역객체 (0) | 2021.09.10 |
[Javascript] new Function 문법 (0) | 2021.09.09 |
[Javascript] JSON (0) | 2021.09.08 |