두번째 문제는 첫번째 문제인 재귀 - 1부터 n까지 연속된 수의 합을 응용한 문제이다.


문제 2) 주어진 범위 내 홀수의 합 출력

이 문제에서는 매개변수의 범위가 정해져있는 가운데 매개변수보다 작은 홀수의 합만 재귀로 구하면 된다.

문제 2. 홀수의 합 출력
1부터 N(0 < N <= 1000)까지 홀수의 합을 출력하는 프로그램을 재귀함수로 구현
1. input the number = 999
    1부터 999까지의 합 : 250000
2. input the number = 725
    1부터 725까지의 합 : 131769
3. input the number = 527
    1부터 527까지의 합 : 69696
4. input the number = 406
    406까지의 합 : 41209    


코드 및 풀이

(1) while

해당 문제 역시 재귀를 생각하기 전에 whilefor를 사용하여 풀어보았다.

# while 사용

def odd_sum_while():
    result = 0
    n = int(input("input the number : "))
    import copy
    num = copy.copy(n)
    a = 0
    while a <= n:
        if n > 1000:
            return "1000과 같거나 작은 수를 입력하세요!"
        elif a > 0 and not a % 2 == 0:
            result += a
        a = a + 1
    return "1부터 {n}까지 홀수의 합 : {result}".format(n=num, result=result)    

### 실행 ###
odd_sum_while()

### 출력 ###
# input the number : 1000
# '1부터 1000까지 홀수의 합 : 250000'

while문을 사용할 경우 n의 값이 1000보다 작아야하는 예외처리를 해준 후 n보다 작거나 같은 a값 중 1씩 더하면서 2로 나누어지지 않는 값(=홀수)만 리턴값인 result에 더해준다. a는 n보다 커지는 순간 반복문을 종료하게 된다.


(2) for

for문을 사용하여 작성한 코드는 다음과 같다.

# for 사용

def odd_sum_for():
    result = 0
    n = int(input("input the number : "))
    import copy
    num = copy.copy(n)
    
    for i in range(0, n + 1):
        if n > 1000:
            return "1000과 같거나 작은 수를 입력하세요!"
        elif not i % 2 == 0:
            result += i
    return "1부터 {n}까지 홀수의 합 : {result}".format(n=num, result=result)

### 실행 ###
odd_sum_for()

### 출력 ###
# input the number : 1000
# '1부터 1000까지 홀수의 합 : 250000'

역시 range()함수를 사용하여 범위를 정해주고 반복문을 실행하면서 2로 나누어지지 않는 i값만 리턴값인 result에 더해주었다. 또, 0 < N <=1000 에 대한 예외처리도 추가하였다.


(3) recursive function

다음은 재귀로 푼 방식이다.

# 재귀 사용

def recursive02():
    import copy
    n = int(input("input the number : "))
    num = copy.copy(n)
    def odd_sum_recursive(n):
        if n > 1000:
            return "1000과 같거나 작은 수를 입력하세요!"
        elif n <= 0:
            return 0
        if n % 2 == 0:
            return (n - 1) + odd_sum_recursive(n - 3)
        return n + odd_sum_recursive(n - 2)
    print("1부터 {n}까지의 합 : {result}".format(n=num, result=odd_sum_recursive(n)))
    

### 실행 ###
recursive02()

### 출력 ###
# input the number : 999
# 1부터 999까지의 합 : 250000

먼저 입력받은 input이 1000 이하인지 검사한 후, 주어진 범위값이 짝수인지 판별하여 그에 따른 재귀식을 작성하였다. 탈출조건은 n의 값이 0보다 작을 경우 더할 값을 0으로 반환하여 종료한다.


실행시간 측정해보기

# n = 1000일 때

# (1) while
runtime(odd_sum_while())  # 7.859780453145504e-07

# (2) for
runtime(odd_sum_for())  # 1.7050188034772873e-06

# (3) recursive
runtime(add_sum_recursive(1000))  # 8.179922588169575e-07


완료 코드

# 완료 코드

def add02():
    import copy
    n = int(input("input the number : "))
    num = copy.copy(n)
    
    def odd_sum_while02():
        result = 0
        a = 0
        while a < n:
            if n > 1000:
                return "1000과 같거나 작은 수를 입력하세요!"
            elif a > 0 and not a % 2 == 0:
                result += a
            a = a + 1
        return result  

    def odd_sum_for02():
        result = 0
        for i in range(0, n + 1):
            if n > 1000:
                return "1000과 같거나 작은 수를 입력하세요!"
            elif not i % 2 == 0:
                result += i
        return result

    def odd_sum_recursive02(n):
        if n > 1000:
            return "1000과 같거나 작은 수를 입력하세요!"
        if n <= 0:
            return 0
        # 논리연산자(&)를 사용하여 홀수인 값만 판별한다.
        elif n % 1:
            return n + odd_sum_recursive02(n - 2)
        return odd_sum_recursive02(n - 1)
        
    print("while - 1부터 {n}까지의 합 : {result}".format(n=num, result=odd_sum_while02()))
    print("for - 1부터 {n}까지의 합 : {result}".format(n=num, result=odd_sum_for02()))
    print("recursive - 1부터 {n}까지의 합 : {result}".format(n=num, result=odd_sum_recursive02(n)))
    
### 실행 ###  
add02()

### 출력 ###
# input the number : 1000
# while - 1부터 1000까지의 합 : 250000
# for - 1부터 1000까지의 합 : 250000
# recursive - 1부터 1000까지의 합 : 250000



Julia Hwang

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