[Python] 재귀함수 - 값이 반환되지 않을 때, 종료 조건, 출력 위치, 대칭 문제

2023. 1. 20. 16:59파이썬(Python)

반응형

1) 재귀함수

n개의 줄에 걸쳐 별을 출력하는 문제

n=5일 경우

*
*
*
*
*

 

- print_star(n) 함수 정의 : 1~n번째 줄까지 별을 출력한다.

- print_star(n-1)을 먼저 수행하여 1~n-1번째 줄까지 별을 출력 후, n번째 줄을 출력을 정의한다.

- 이러한 방식으로 해당 함수를 구현하는데 동일한 함수를 다시 이용하게 되는 것을 재귀함수라고 한다.

 

def print_star(n):
    print_star(n-1)
    print('*')

 

● 문제점

- print_star(5) 함수가 print_star(4)를 부르게 되고 4는 3을, 3은 2를,..., 0은 -1을, -1은 -2를,... 무한대로 부르게 된다.

- 이러한 문제를 해결하기 위해 재귀 함수는 종료 조건을 적절하게 설정해야 한다.

● 종료 조건을 사용한 해결방안

- n=1일 때 print_star(0)을 수행한 후, 별을 출력한다.

- n=1이면 별을 1개의 줄만 출력해야 하고 print_star(0)은 별을 출력하지 말아야 한다.

- 즉, n=0일 때 재귀 함수를 종료시켜야 하고 이는 종료 조건을 의미한다.

- n=0일 때 return을 사용한다.

 

def print_star(n):
    if n==0:
        return
    print_star(n-1)
    print('*')

print_star(5)

결과

*
*
*
*
*

 

- 함수의 실행 과정은 다음과 같다.

print_star(5) 실행 과정


2) print 위치

n개의 줄에 걸쳐 각 행의 개수만큼 별을 출력

n=5

*
**
***
****
*****

 

- print_star(n) : 1~n번째  줄까지 별을 출력하는 함수

- print_star(n-1)를 먼저 수행하여 1 ~ n-1번째 줄까지 별을 출력 후, n번째 줄을 출력한다.

- 종료조건은 n이 0일 때이다.

def print_star(n):
    if n==0: return
    print_star(n-1)
    print('*'*n)

print_star(5)

결과

*
**
***
****
*****

 

- print_star 함수 내부에서 printprint_star서로 바꾸면?

def print_star(n):
    if n==0: return
    print('*'*n)
    print_star(n-1)

print_star(5)

결과

*****
****
***
**
*

- 1부터 n-1번째 줄까지 출력을 진행하기 전n개의 별을 출력했기 때문이다.

 

● 재귀함수에서 print문을 어디에 정의하는지에 따라 다른 결과를 출력하게 된다.


Q) 좌우 대칭 정렬

- 정수 n을 입력

- m=0이면 1부터 n까지 수를 출력 후, n-1부터 1까지 출력

- m=1이면 n부터 1까지 수를 출력 후, 2부터 n까지 출력

 

def print_number_sort(n,m):
    if n==0: return
    if n==1 and m==1: return
    print_number_sort(n-1,m)
    print(n,end=' ')

def print_number_reverse(n):
    if n==0: return
    print(n,end=' ')
    print_number_reverse(n-1)

def order_print(n):
    print_number_sort(n,0)
    print_number_reverse(n-1)
    print()
    print_number_reverse(n)
    print_number_sort(n,1)

n=int(input())
order_print(n)

결과

>> 5
1 2 3 4 5 4 3 2 1 
5 4 3 2 1 2 3 4 5

 

- print_number_sort(n, m) : 숫자를 오름차순으로 정렬하기 때문에 재귀 함수를 호출한 후 출력한다.

- print_number_reverse(n, m) : 숫자를 내림차순으로 정렬하기 때문에 출력 후 재귀 함수를 호출한다.

- 특히 내림차순 후 오름차순으로 정렬할 때 1은 한 번만 나와야 한다.

- print_number_sort함수에서 m이 1이면서 n이 1이 될 때 종료를 한다.


Q) 대칭되는 별모양

- 정수 n을 입력

- 재귀함수를 사용해 대칭되는 모양의 별을 출력

출력 예시) 

>> 3
* * * 
* *
*
* *
* * *
def print_star(n):
    if n==0: return
    print('* '*n)
    print_star(n-1)
    if n==1: return
    print('* '*n)

n=int(input())
print_star(n)

- 별의 개수가 감소되다가 증가하는 경우이다.

- n개의 별을 출력n-1을 가지는 재귀 함수를 호출

- 별 1개는 1번만 출력하므로 재귀 호출 후 출력에서 n=1일 때 출력하지 않는다.

- n이 2 ~ n일 때 순차적으로 출력한다.