알아보자! 재귀함수

dorazi·2020년 12월 19일
0

js

목록 보기
10/10
post-thumbnail

드디어 정리하는 재귀 함수..
사실 재귀 함수를 처음 접한 건 pre 코스에서였지만 그때는 정리할 엄두도 안 나서 정리를 못 했던 거 같다...
딱 처음 재귀 함수라는 것을 알게 되었을 때는 음.. 별로 안 어려운데? 였지만 알면 알수록 머리가 아파지는 그런 아이였다. 지금은 조금은 알게 된 거 같지만 아직도 막상 마주하면 겁부터 나는 거 같다😭😭😭
재귀는 그림으로 그려보는게 도움 된다고하니 열심히 그려봐야겠다!

재귀 함수란 무엇이죠!

재귀 함수란 자기 자신을 호출하는 함수를 말한다.

위와 같이 함수의 인자로 받은 값을 함수 내에서 작업을 한 뒤 그 값을 자기 자신에 넣어 탈출 조건에 충족할 때까지 반복시키는 방식입니다!
만약 탈출 조건이 명확하지 않거나 없으면 끝없이 들어가겠죠...

음 이제 어떤 방식인지 알았으니 예시를 한번 내보겠습니다!

A가 B에게 사과가 어딨냐고 물어봤어요 B는 A에게 C가 그러는데 D가 E한테 물어봤는데 E가 F한테 물어봤더니 F가 사과는 냉장고에 있다고 E한테 말하고 E는 D에게 C는 D가 그랬다고 B에게 B는 A에게
C가 그랬다고 A에게 말해줬어요.

엄청 복잡하지 않나요... 저도 쓰면서 이게 맞나 하면서 쓴 거 같네요

function findApple (person) {
  // 사과 위치 물어보기
  let answer = askOtherPerson();
  
  //사과가 어딨는지 모르면
  if(answer === null){
	return findApple(otherperson) // 재귀호출
  }
  //답이나오면
   else{
	return answer  //사과 위치
  }
}

아마 코드로 표현하면 이런 느낌일 것 같습니다!

주어진 수까지의 합을 재귀로 구현

짠!

function sum(num){
  if(num === 0){
    return 0
  }
  return num + sum(num - 1)
}

음.. 위의 재귀 함수의 실행 과정을 쪼개서 그림으로 표현한다면 이럴 겁니다!
그림그리기 너무 힘듭니다..

탈출 조건까지 내려갔다가 탈출 조건에 성립하면 반환값을 가지고 아래서 위로 다시 생성했던 스택들을 처리하면서 올라옵니다.

반복문과 다른점

근데 사실! 재귀 함수를 사용한 문제들은 반복문을 사용해서도 풀 수 있고 좀 더 명확하고 쉽게 작성 할 수도 있습니다!

예를 들어 [1,2,3,4,5,6,7,8,9]

모든 배열 요소의 합을 구한다고 생각해 봅시다.

let arr1 = [1,2,3,4,5,6,7,8,9]

function adder(arr){
  let sum = 0;
  
  for(let i = 0 ; i < arr.length; i++){
  sum += arr[i]
  }
  return sum
}

adder(arr1) // 45

재귀는 언제 쓰지?

우리가 지금까지 썼던 반복문을 이용하면 정말 쉽게 값을 구할 수 있을 겁니다

하지만 아래와 같은 다차원 배열이라면 어떨까요?
[1,2,3,[4,5,[6,[[[[[7,[[],8]]]]]]]],9]
반복문을 사용해서 구하려면 엄청 많은 반복문과 조건을 넣어야지 구할 수 있을 겁니다. 또 이보다 더 깊은 다차원 배열이 들어온다면 코드도 새로 수정해 줘야 겠죠..

이럴 땐 재귀 함수를 이용해서 해결하면 간단하게 해결할 수 있습니다!

let arr2 = [1,2,3,[4,5,[6,[[[[[7,[[],8]]]]]]]],9]

function adder2(arr){
  let sum = 0;
  function recursive(arr){
    for(let i = 0; i < arr.length; i++){
      if(typeof arr[i] === 'number'){
  	    sum += arr[i]
	  }
	  else if(Array.isArray(arr[i]) === true){
	    recursive(arr[i])
	  }
    }
  }
  recursive(arr)
  return sum
}

adder2(arr2) // 45

코드를 요약하자면 반복문을 돌다가 요소가 숫자 면 그대로 sum에 추가해 주고 만약 요소가 배열이라면 그 배열을 인자로 받은 자기 자신을 다시 호출합니다.
이런 식으로 재귀를 사용한다면 아무리 깊은 배열이나 객체를 만나더라도 좀 더 수월하게 값을 찾을 수 있지 않을까 싶네요!

profile
프론트엔드 개발자

0개의 댓글