data structures - recursion(재귀)

박현성·2024년 1월 22일
post-thumbnail

재귀함수에대해서

재귀함수가 뭔데?
재귀.. 프로그래밍 공부한지 시간이 좀지났지만 아직도 재귀를 쓰는게
어색하다 어색하다라고 해야할까 기본적인 팩토리얼함수나,피보나치 수열로 연습을
해보아도 다른부분에서 응용해서 만들려고하면 억소리와함께 손가락이 멈춘다 열심히 내머릿속으로
만들어보지만 vscode 디버그로 stack을 보면서 해도 아직도 쉽지않다
마치 재귀함수같다 그래서 재귀함수가 뭔데?
자기 자신을 참조하는 함수이다(여기서 자기자신을 참조한다는것은) 함수내에서
한번더 본인을 호출한다는것이다 그래서 종료 조건을 잘생각해서 작성해야한다 아니면
stack overflow에 빠지게 된다 무한으로 호출해 메모리가 초과되는것이다.

간단하게 누적합을 구하는 재귀함수로 설명해보겠다

function recursion(n){
	if(n === 1) return n 
    //n이 1일 경우, 1을 반환합니다. 이것은 재귀 호출의 종료 조건입니다.
    return n + recursion(n-1)
    // recursion함수안에서 자기자신을 호출하고 맨마지막 n이1과같을때 n을(값1) 반환해주면
    // 자료구조 stack과 같다 선입후출로 recursion(n-1) 이부분이 1이되는것이다 그럼 이전
    //함수에서 n과 합해 계속 값이 누적되게 된다.
}

종료 조건 설정이 중요하고 재귀 함수는 무한 루프에 빠질 수 있기 때문에 항상 종료 조건을 설정을 고민해야한다.
스택 오버플로우(Stack Overflow) 주의: 재귀 호출이 너무 많이 발생하면 스택이 넘치는 문제가 발생할수있어서 이를 방지하기 위해 반복문이나 꼬리 재귀 최적화를 고려할수도 있다.
성능 고려: 재귀 함수의 성능은 반복문에 비해 부담이 있을 수 있는데 특히 깊은 재귀 호출이 많은 경우 성능에 영향을 줄 수 있다.

// 팩토리얼 계산하는 재귀 함수
function factorial(n) {
  // 종료 조건: 0 또는 1일 때 1을 반환
  if (n === 0 || n === 1) {
    return 1;
  } else {
    // 재귀 호출: n! = n * (n-1)!
    return n * factorial(n - 1);
  }
}

// 예시: 5! 계산
let result = factorial(5);
console.log(result); // 출력: 120

설명을 아무리 잘해도 직접 꼭 디버깅해서 stack부분을 확인하여 어떻게 호출되는지
꼭 확인해야한다 재귀함수로 구현할수있는것은 반복문으로 만들수도있다 허나 다뤄야하는
값이 크지않을때 간결하고 가독성이좋게 쓸수있어서 좋다 (또한 간지난다)

dfs에서 재귀함수로 구동하는 부분이 많기때문에 꼭 알고 넘어가야하는 부분이기도하다.
허나 아직도 쉽지않다 절망의 계곡(Valley of Despair)에 빠졌다가, 깨달음의 언덕(Slope of Englightenment)를 지나는중인것같지만 아직 시원찮다.

profile
ui/ux에 중점을 두고 고객의 니즈를 기술적으로 해결하는것을 좋아하는 개발자입니다

0개의 댓글