1 부터 n 까지 숫자 coutdown & countup

써니니(Sunny)·2021년 6월 23일
0

모든 재귀함수는 반복문으로 표현 할 수 있다.
재귀함수는 elegant하지만 직관적이지 않아서 반복문으로 먼저 구현을 해보고 다시 리컬시브하게 짜보자 !

재귀는 귀납법의 원리를 기본적으로 따르므로 귀납법 부분을 참조하면 도움이 많이 될 것 !! :))

먼저 반복문을 사용하여 1부터 n까지 count up 하는 함수를 작성해보자. cnt라는 변수를 만들어서 1씩 증가시키면서 n까지만 출력하도록 while loop를 작성할 수 있다.

def one_to_n(n):
  cnt = 1
  while cnt <= n:
    print(cnt)
    cnt += 1
#실행결과
one_to_n(10)
1
2
3
4
5
6
7
8
9
10

반복문을 사용하여 1부터 n까지 count down 하는 함수는 반대로 cnt시작을 n으로 시작해서 하나씩 줄여가면서 cnt가 1일때까지 출력하면 된다.

def n_to_one(n):
  cnt = n
  while cnt >= 1:
    print(cnt)
    cnt -= 1

이번에는 재귀함수로 같은 함수들을 구현해보자.
재귀함수는 count down 형태가 흔해서 조금 더 쉽게 이해가 가므로 n부터 1까지 출력하는 함수 먼저 작성해 보자.
재귀의 기본은 base case 와 recursive step을 작성하는 것인데, 여기서는 간단히 base case는 1일때 멈춰야하고, recursive의 경우 descrete하게 1씩 줄여서 호출하면 되는것을 알수있다.

def countdown_rec(n):
  if n == 1:
    return 1
  else: 
    print(n)
    countdown_rec(n-1)

count up의 경우 위의 count down처럼 클래식한 모양의 리컬시브 형태로 생각하면 어려울수있다.
가능한 솔루션을 먼저 보면, 다음과 같은데 이는 function call이 역순으로 반환된다는 점을 이용해서 리컬시브 콜과 반환하는 값의 순서를 바꿔주는 트릭을 사용하면 아주 간단히 작성할수있다! (놀라워랑)

def countup_rec(n):
    if n >= 1:
        countup_rec(n-1)
        print(n)

즉 위에 작성한 count down도 간단히 세줄로 구현이 가능하다! 하지만 개인적으로 base case 와 recursive step을 확실하게 작성하는 편이 그나마 어려운 재귀함수의 readability에 좋다고 생각한다 :)))

def countdown_rec(n):
    if n >= 1:
        print(n)
        countdown_rec(n-1)
        
profile
I am interested in Database Engineering !

0개의 댓글