자연수의 정의
- 1은 자연수임.
- 어떤 자연수의 바로 다음 수도 자연수임
** 팩토리얼(n!)의 정의
- 0! = 1
- n > 0 이면 n! = n x (n-1)!
def factorial(n: int) -> int:
if n > 0:
return n * factorial(n-1)
else:
return 1
- 직사각형에서 짧은 변의 길이를 한 변으로 정사각형으로 나눔
- 남은 직사각형에서 똑같은 과정을 반복
- 마지막에 남은 정사각형의 길이가 최대 공약수임
def gcd(x: int, y: int) -> int:
"""정숫값 x와 y의 최대 공약수를 반환"""
if y == 0:
return x
else:
return gcd(y, x % y)
def recur(n: int) -> int:
if n > 0:
recur(n - 1)
print(n)
recur(n - 2)
x = int(input('정숫값을 입력하세요: '))
recur(x)
recure(4) 의 실행 과정
- recur(3)을 실행
- 4를 출력
- recur(2)를 실행
recure(4) 의 실행 과정
1. recur(0)을 실행
2. 1을 출력
3. recur(-1)를 실행
def move(no: int, x: int, y: int) -> None: # 원판 no개를 x기둥에서 y기둥으로 옮김)
if no > 1:
move(no - 1, x, 6 - x - y)
if no > 1:
move(no - 1, 6 - x - y, y)
8개의 서로 공격할 수 없도록 8 * 8 체스판에 배치
pos[i] = j
로 나타냄pos = [0] * 8 # 각 열에서 퀸의 위치
flag = [False] * 8 # 각 행에 퀸을 배치했는지 체크
def put() -> None:
"""각 열에 놓은 퀸의 위치를 출력"""
for i in range(8):
print(f'{pos[i]:2}', end='')
print()
def set(i: int) -> None:
"""i 열의 알맞은 위치에 퀸을 배치"""
for j in range(8):
if not flag[j]: # j 행에 퀸을 배치하지 않았으면
pos[i] = j # 퀸을 j 행에 배치
if i == 7: # 모든 열에 퀸을 배치를 완료
put()
else:
flag[j] = True
set(i + 1) # 다음 열에 퀸을 배치
flag[j] = False
set(0) # 0열에 퀸을 배치
pos = [0] * 8 # 각 열에 배치한 퀸의 위치
flag_a = [False] * 8 # 각 행에 퀸을 배치했는지 체크
flag_b = [False] * 15 # 대각선 방향(↙↗)으로 퀸을 배치했는지 체크
flag_c = [False] * 15 # 대각선 방향( ↘↖)으로 퀸을 배치했는지 체크
def put() -> None:
"""각 열에 배치한 퀸의 위치를 출력"""
for i in range(8):
print(f'{pos[i]:2}', end='')
print()
def set(i: int) -> None:
"""i 열의 알맞은 위치에 퀸을 배치"""
for j in range(8):
if( not flag_a[j] # j행에 퀸이 배치 되지 않았다면
and not flag_b[i + j] # 대각선 방향(↙↗)으로 퀸이 배치 되지 않았다면
and not flag_c[i - j + 7]): # 대각선 방향( ↘↖)으로 퀸이 배치 되지 않았다면
pos[i] = j # 퀸을 j행에 배치
if i == 7: # 모든 열에 퀸을 배치하는 것을 완료
put()
else:
flag_a[j] = flag_b[i + j] = flag_c[i - j + 7] = True
set(i + 1) # 다음 열에 퀸을 배치
flag_a[j] = flag_b[i + j] = flag_c[i - j + 7] = False
set(0) # 0열에 퀸을 배치