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)
결과
*
*
*
*
*
- 함수의 실행 과정은 다음과 같다.
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 함수 내부에서 print와 print_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일 때 순차적으로 출력한다.
'파이썬(Python)' 카테고리의 다른 글
[Python] 재귀 함수 - Return Value. 문제풀이 (홀수짝수 합, 최대최소, 점화식, 최소공배수) (0) | 2023.01.23 |
---|---|
[Python] - 재귀 함수 : 값을 반환. return value. factorial. 각 자리 숫자합, 점화식 및 수열 (0) | 2023.01.22 |
[Python] 변수 - Mutable vs Immutable (0) | 2023.01.13 |
[Python] 함수 - return 반환 값을 이용한 예제 프로그램 작성 (연산, 연속 부분 수열, 날짜 및 날씨) (0) | 2023.01.04 |
[Python] 함수 - return 값 반환. 기본값 설정. asterisk (0) | 2023.01.03 |