재귀함수란
def factorial(n: int) -> int:
"""양의 정수 n의 팩토리얼을 구하는 과정"""
if n > 0:
return n * factorial(n - 1) # 재귀호출
else:
return 1
if __name__ == '__main__':
n = int(input('출력할 팩토리얼 값을 입력하세요.: '))
print(f'{n}의 팩토리얼은 {factorial(n)}입니다.')
(math 모듈에서 math.factorial() 함수 제공)유클리드 호제법
ex) 10, 12의 최대공약수: 2
10 * 12 //2 =60
10, 12의 최소 공배수는 60
재귀로 유클리드 호제법 사용
def gcd(x: int, y: int) -> int:
"""정숫값 x와 y의 최대 공약수를 반환"""
if y == 0:
return x
else:
return gcd(y, x % y)
math 모듈에서 math.gcd()
함수 제공
from stack import Stack # stack.py의 Stack 클래스를 임포트
def recur(n: int) -> int:
"""재귀를 제거한 함수 recur"""
s = Stack(n)
while True:
if n > 0:
s.push(n) # n 값을 푸시
n = n - 1
continue
if not s.is_empty(): # 스택이 비어 있지 않으면
n = s.pop() # 저장하고 있는 값을 n에 팝
print(n)
n = n - 2
continue
break
x = int(input('정수값을 입력하세요.: '))
recur(x)
# 4 push -> 3 push -> 2 push -> 1 push -> n = 0, 1 pop -> n= -2, 2 pop ->
# n= 0, 3 pop -> n= 1, 1 push -> n= 0, 1 pop -> n= -1, 4 pop ->
# n= 2, 2 push -> n= 1, 1 push -> n= 0, 1 pop -> n= -1, 2 pop -> n= 0, break
def move(no: int, x: int, y: int) -> None:
"""원반을 no개를 x 기둥에서 y 기둥으로 옮김"""
if no > 1:
move(no - 1, x, 6 - x - y)
print(f'원반 [{no}]을(를) {x}기둥에서 {y}기둥으로 옮깁니다.')
if no > 1:
move(no - 1, 6 - x - y, y)
print('하노이의 탑을 구현하는 프로그램입니다.')
n = int(input('원반의 개수를 입력하세요.: '))
move(n, 1, 3)
import sys
input = sys.stdin.readline
def dfs(num):
global ans
# N행까지 왔다면 완료
if num == N:
ans += 1
return
for j in range(N):
# 열, 대각에 퀸 없다면
if v1[j] == 0 and v2[j+num] == 0 and v3[j-num] == 0:
# 체크하고 아래 행으로 재귀호출
v1[j] = v2[j+num] = v3[j-num] = 1
dfs(num + 1)
# 탐색 끝났으면 체크 해제하고 다음 칸으로 이동
v1[j] = v2[j + num] = v3[j - num] = 0
N = int(input())
ans = 0
# 열, 왼쪽 대각, 오른쪽대각 퀸 있는지 체크 배열
v1, v2, v3 = [[0] * (N * 2) for _ in range(3)]
dfs(0)
print(ans)