3번은 정해진 범위 (0 < N <= 30)에서 2 ** n의 값을 모두 출력하는 문제이다. 해당 문제의 핵심은 재귀를 계산한 값을 리턴하기 전에 출력을 한다는 데에 있었다. 이 문제도 for, while, 그리고 recursive방식으로 각각 풀어보았다.


문제 3) 2 ** n 출력

해당 문제는 매우 간단하다.

문제 3. 2 ** n 출력

2 ** n (0<n<=30)을 재귀함수로 구현


# 예상하는 결과
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
131072
262144
524288
1048576
2097152
4194304
8388608
16777216
33554432
67108864
134217728
268435456
536870912
1073741824


코드 및 풀이

(1) while

def square_while():
    n = 1
    while n <= 30:
        print(2 ** n)
        n += 1

주어진 범위 내에서 n1씩 더하면서 2 ** n 의 값을 출력하도록 작성하였다.


(2) for

def square_for():
    for i in range(31):
        print(2 ** i)

해당 문제 역시 range() 함수를 사용하여 for문을 돌면서 2 ** i 값을 출력하도록 작성하였다.


(3) recursive function

def recursive03():
    def square_recursive(n=30):
        if n == 1:
            return 2
        r = square_recursive(n - 1)
        print(r)
        return r * 2
    return print(square_recursive())

재귀를 사용할 때는 탈출조건을 먼저 정의해주고 재귀식의 값을 리턴하기 전에 먼저 값을 출력해주어야 한다. 탈출조건은 n == 1일 때 종료하고, 지수값이므로 2가 반환되도록 설정하였다.

또, 재귀를 돌면서 값을 하나씩 출력해야하므로 r에 이전 재귀값의 결과(square_recursive(n - 1)를 할당해주고 r을 리턴 전에 출력하도록 하였다. 또 외부함수의 리턴값에 print()를 사용하여 위의 예상 결과값처럼 출력되도록 맞춰주었다.


추가) 문제 1. 연속된 수의 합 출력해보기

위의 방식을 사용하여 문제 1번도 더하는 값들을 모두 출력해보았다. 코드는 다음과 같다.

def recursive01():
    n = int(input("Input the number : "))
    def seq_sum_recursive(n):
        if n <= 1:
            return 1
        r = seq_sum_recursive(n - 1)
        print(r)
        return n + r
    return print(seq_sum_recursive(n))


실행시간 측정해보기

# (0 < N <= 30)

# (1) while
square_while()  # 5.259644240140915e-07

# (2) for
square_for()  # 4.930188879370689e-07

# (3) recursive
recursive03(). # 7.109483703970909e-07



Julia Hwang

디발자를 꿈꾸는 웹개발자의 블로그입니다.