'재귀'에 해당되는 글 1건

  1. 2021.07.23 C# - 함수형 프로그래밍, 재귀 호출
728x90

재귀 호출은 for문 while문 같은 반복에 비해 더 짧게 구현 가능한 경우가 많기 때문에 함수형 접근 방식에 적합하다고 한다. 대신 설계 및 테스트는 어려운 편


재귀 호출은 기본 케이스를 갖는 것이 일반적이며 기본 케이스란 재귀의 종료 조건을 정의하는 것을 말한다. 


반복하는 형태의 구현이 더 효율적인 경우에 컴파일러가 재귀 호출을 반복으로 변환하기도 한다고 한다.


기본 케이스가 실행될 때까지 끊임없이 자신을 호출하는 형태직접 재귀 호출(꼬리 재귀, 누적기 전달형, 연속 전달형..)이라 하고, 

간접 재귀 호출이라는 것도 있는데 간접 재귀는 최소 두 개의 함수가 관여하는 형태로 함수 A,B가 존재할 경우 함수 A가 B를 호출하고, 함수 B가 다시 A를 호출하는 형태

이 형태를 재귀 호출로 볼수 있는 근거는 함수 B가 A를 호출할 때 함수 A는 이미 B를 호출하면서 활성화 되었기 때문. 즉 함수 B가 A를 호출했을 때, 함수 A의 호출이 아직 완료되지 않은 상태로 남아 있다.

bool IsOdd(int number)

{

if (number == 0) return false;

else return IsEven(number - 1);

}

bool IsEven(int number)

{

if (number == 0) return true;

else return IsOdd(number - 1);

}


LINQ의 Aggregate를 적용하면 재귀 함수를 함수형 접근 방식으로 리펙토링 할수 있다.

int[] numbers = { 1, 2, 3, 4, 5 };

var data = numbers.Aggregate((num1, num2) => num1 * num2);

결과 : 120


요약하면 재귀 함수를 사용하면, 표현이 어렵지 않게 누구나 보기에 자연? 스러워 진다면 가독성이 좋아지고, 변수의 사용을 줄여줌으로써 함수형 프로그래밍에 알맞다라고 하는거 같다.

함수를 일급 객체로 취급하는 함수형 프로그래밍에서 함수에서 함수를 호출하여 처리 하는 방식인 점도 있는거 같다.

하지만 재귀 함수도 잘못 사용 되어질 경우엔 메모리를 많이 차지할수도 있고 성능이 안좋을수도 있다 (스택에 매개변수, 지역변수, 리턴 값, 종료후 돌아갈 위치 등 스택 메모리에 쌓이니까.. 스택오버플로우)

그리고 가독성이 좋아진다라고 책에는 정리 되어 있지만, 복잡한 로직의 재귀 함수일 경우엔 오히려 이해하거나 보는데 있어서 가독성을 해칠 경우가 있을거 같다.

즉, 재귀 함수의 형태는 함수형 프로그래밍에 맞지만 이것을 이용하여 개발하는데 있어서는 주의할 점과, 고려해야할 것 등 어려움이 많을수 있다 정도 인거 같다.

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침