회고록 블로그

[공부 필기] 재귀함수를 사용하는 이유 본문

2. 프로그래밍 언어 공부/JavaScript

[공부 필기] 재귀함수를 사용하는 이유

김간장 2021. 6. 1. 19:10

생활코딩 JavaScript 공부를 하다가 재귀함수를 공부하게 되었는데

반복문이 있음에도 불구하고 왜 재귀함수를 사용하는지 이해를 할 수가 없었다.

 

그래서, 구글신의 도움을 받아 찾아보았다.

이 글은 개인적으로 정리해놓고 필요할 때 찾아보기 위해 작성하는 글이다.

 


아래 코드는 recurse 라는 함수를 recurse라는 함수 안에서 다시 호출해서 사용하는 코드이다.

반복문 두고 왜 굳이 이런 식으로 사용하는지 이해를 할 수 없었다.

 

물론 이 코드는 단지 '재귀함수'에 대해서 학습하기 위한 코드이기 때문에

재귀함수를 쓰기에는 비효율적인 코드일 수 있지만('어? 이 코드에서는 반복문을 쓰는게 덜 복잡하지 않나?'라는 생각이 들 수 있음)

대충 이 코드가 반드시 '재귀함수를 사용해야만 하는 코드'라고 가정하자.

 

그래서 결국 중요한 것은 왜 반복문 대신에 재귀함수를 사용하는 이유를 잘 이해 못하겠다.

 

function recurse(target, callback){
    if(target.nodeType === 1){
        // nodeType '1' is 'A'(anchor)
        var c = target.childNodes;
        for(var i=0; i<c.length; i++){
            recurse(c[i], callback);
        }
    }
}

recurse(document.getElementById('start'), function(elem){
    console.log(elem);
});

 


그래서 찾아보았다.

왜 재귀함수가 필요할까.

 

그 답을 아래 글에서 찾아왔다.

 

출처: https://www.codecademy.com/forum_questions/4fd5964ffc052d000300483f

 

Seriously, will I ever need recursion? | Codecademy

Even with the new lesson and its patient teachings, I'm still totally bamboozled by recursion. I can sort of see what the code is attempting to do, but if you asked me to work out a problem from scratch with a blank page, I wouldn't know where to start. Is

www.codecademy.com

부족한 영어실력으로 해석해보자면..

 

재귀적 사고는 프로그래밍에서 굉장히 중요하고, 문제를 잘게 부수는데 도움을 준다.

재귀함수는 반복문으로 작성하는 것보다 더 읽기 쉽게 만들어 준다고 한다. (=가독성이 높다는 이야기)

재귀는 항상, 필드에서(=현업에서), 많은 프로그래밍 언어에서 사용한다는 이야기를 해주시고 계신 것 같다.

그리고 일반적으로 재귀는 깊이우선탐색 등에서 사용한다.

 

 

깊이우선탐색 : ("알고리즘" 책을 찾아 공부하기를 권장)

https://ko.wikipedia.org/wiki/%EA%B9%8A%EC%9D%B4_%EC%9A%B0%EC%84%A0_%ED%83%90%EC%83%89

 

깊이 우선 탐색 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 깊이 우선 탐색의 애니메이션 예시 깊이 우선 탐색( - 優先探索, 영어: depth-first search, DFS)은 맹목적 탐색방법의 하나로 탐색트리의 최근에 첨가된 노드를 선택

ko.wikipedia.org

 

 

또 다른 곳에서 재귀함수에 대해서 좋은 설명을 해주셔서 스크랩 해왔다.

 

출처 : https://javascript.info/recursion

 

Recursion and stack

 

javascript.info

 

중간즈음에 "Recursive traversals"를 보면 얼추 이렇게 설명해주고 계신다.

 

재귀를 사용하기 좋은 경우는 이러한 경우도 있다.

회사가 있는데, 만약 직원이 객체로 표현될 수 있다면. 부서 마다 직원이 배열(array)로 구성되어있다면.

예를 들어 영업조직(sales department)은 직원이 2명이다.

개발조직(development)은 그 안에서 사이트(sites)팀과 내부(internal)팀으로 나뉘고 각 팀에는 직원들이 있다.

그리고 사이트(sites)팀이나 내부(internal)팀이 잘 되면 그 팀 안에서도 또 파트를 나눌 수 있다.

예를 들어서 사이트팀은 그 안에서 사이트A파트, 사이트B파트로 분할될 수 있다.

이러한 상황에서 모든 직원들의 월급의 합을 구하려고 한다.

이때 재귀를 사용하면 심플한 코드가 될 수 있다.

 

 

위의 이런 경우가 깊이우선탐색을 사용할 수 있는 상황이지 않을까 싶다.

 

재귀함수를 사용하는 또 다른 이유에 대한 글을 찾아왔다.

결국 변수의 사용을 줄이기 위해서도 사용한다는 것 같다. 

(친절한 설명과 좋은 내용이 담겨있어서 꼭 읽어보기를 추천)

 

출처: https://velog.io/@tilsong/%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98%EB%8A%94-%EC%96%B8%EC%A0%9C-%EC%8D%A8%EC%95%BC-%ED%95%A0%EA%B9%8C

 

재귀 함수는 언제 써야 할까?

재귀 함수

velog.io

 

하지만 재귀함수는 메모리를 많이 차지해서 성능이 더 떨어지는 위험(?)이 있을 수 있기 때문에

사용할 땐 주의사항을 잘 고려해야 한다고 한다.

 

결론적으로 정리하자면 재귀 함수를 사용하는 이유는 코드의 가독성을 높이고, 변수의 사용을 줄이기 위함이라고 정리할 수 있겠다.

(반복문으로도 돌아가지만 코드의 가독성을 위해서 재귀함수 사용)


항상 보면 가독성을 높은 코드가 좋은 코드라고 한다.

 

컴퓨터 입장에서야... 코드의 가독성이 높든지 낮든지 연산을 하고 처리 하는게 주로 할 일이니 큰 신경쓰지 않지만

그 코드를 작성하고 수정하는 것은 결국 사람들이다.

그리고 사람의 입장에서 복잡한 코드는 별로 읽고 싶지 않을 것이다.

 

마치 유튜브 댓글들에 보이는 줄바꿈 하지 않고 글을 딱딱 붙여서 쓴 글이나,

수식어를 엄청 많이 붙여서 장황하게 10줄로 늘려 쓴 글들은 읽기 싫은 것처럼... (한줄로 표현할 수 있는데 말이다)

 

코드를 만지는 것은 결국 사람이니까 사람에게 더 읽기 쉬운 코드가 수정하기도 편하고 유지보수도 편할 것이다.

그래서 가독성 높은 코드가 좋은 코드라고 하는 것 아닐까. (아닐수도 있다)

 

재귀 함수도 그런 의미에서 사용한다고 생각한다.

Comments