본문 바로가기
JavaScript

JavaScript - 재귀함수 만들기(feat. 반복문 비교)

by 새발개발JA 2023. 3. 1.
반응형

 

 

 

프로그래머스 코테 문제를 풀어보다가 while 문을 사용한 함수를 → 재귀함수로 바꾸어 한번 더 풀어보았다.

처음에는 어렵지만 유형을 익히고 이해하게 될수록 참 재미있어 지는 것 같다.

 

 


JavaScript - 재귀함수 만들기(feat. 반복문 비교)

 

문제를 간단히 설명해보면 다음과 같다. (출처 : 프로그래머스 - 콜라문제)

콜라 빈병 2개를 가져가면 → 새것 1병으로 교환해준다.

나는 총 빈병 20개를 가지고 있다. → 그럼 새것 10병을 받을 것이다.
10병을 그자리에서 마신다 → 그럼 새것 5병을 받을 것이다.
5병을 그자리에서 마신다 → 그럼 새것 2병을 받을 것이다. + 빈병 1개가 남을 것이다.
2병을 그자리에서 마신다  → 그럼 새것 1병을 받을 것이다. 
새병 1개 마셔버리고 + 아까있던 빈병 1개 → 새것 1병을 받을 것이다.

 

여기서 문제는 내가 마신 콜라의 총 갯수를 구하는 것이다. (총 19병)

 

빈병 20 개에서 2 병당 1 개로 교환하는 조건에서

  빈병 n 개에서 a 병당 b 개로 교환하는 조건으로 어떤 수를 넣어도 계산해주는 함수를 짜야한다.

 

 

 방법 1) While 문 

손쉽게 접근할 수 있는 방법은 while 문을 사용한 접근이였다.

일단 새 콜라와 빈병을 표현할 변수를 선언하고,

반복문을 돌려 (교환에 필요한 빈병의 갯수가 0 이상일 때만)

교환한 새콜라의 갯수를 구하고

그것을 새콜라의 갯수에 더해주자

또한 빈병은 현재 남은 빈병으로 갯수를 점차 줄여 준다 (while문의 종료조건으로 직 - 진)

 

 

 방법 2) 재귀함수를 사용하기 

 

재귀함수는 어려워보이고, 이해하기 힘들었다.

사실 이번이 첫만남은 아니다. 몇번 만났었는데, 해집어보고 동작방식을 이해하려고 고생을 꽤나 했었다.

내가 직접 만들어보려고 하니 더욱 힘들었다.

 

그래서 이번에는 아래 참고한 블로그를 읽고 좀더 다른 접근법으로 접근해보았다.

1. 베이스 조건 만들기
2. 리턴 타입을 확인하기 (베이스 조건만으로도 리턴이 되는지 확인해보니 쉬웠다)
3. 베이스 조건에 가까워질 수 있도록 매개변수의 값을 서서히 줄이면서 연산하기
4. 한단계 위, 3단계 위 정도 까지 값이 잘 돌아가는지 테스트해보기

 

함수자체가 크게 반복문의 역할을 한다고 이해했다.

 

베이스 조건 만들기리턴타입 확인하기 

그래서 if 문으로 베이스조건(종료조건)을 먼저 지정해서 종료조건에 도달하면 

계산 완료된 새콜라의 갯수(리턴타입)를 반환하면서 함수가 종료된다.

 

 

베이스 조건에 가까워질 수 있도록 매개변수의 값을 서서히 줄이면서 연산하기

교환한 콜라와 빈병, 새콜라의 계산식은 while 문과 똑같다. 

종료 조건에 도달할 수 있도록 빈병이 점차 줄어들 것이고,

리턴을 할 때 줄어든 빈병을 매개변수로 넣고 다시 재귀함수를 호출하였다.

 

 

 

 

 

ref: 

 

야, 너두 재귀할 수 있어: 재귀가 풀리는 4단계 접근법

재귀를 쉽게 푸는 방법은 재귀적으로 생각하지 않는 것이다. 4단계로 나눠서 생각하면 끝없는 재귀를 머릿속에 그리지 않고도 재귀를 풀 수 있다!

velog.io

 

반응형

댓글