하노이도 동경이라 불렸다고 한다.
이니셜 V도 헛된 꿈은 아니란 사실이다.
동남아식 동경 꺽기 ON
두부 대신 반미(Anti-American아님, 음식이름임)를 배달할 듯하다.
…
아무튼 오늘은 재귀함수를 배우며 하노이탑에 관해 문제를 풀어보게 되었다.
혼자 힘으로 풀지는 못했다. 도저히 모르겠어서 말이다.
저리 간단한 코드로 구현가능하다는 점에서 재귀함수의 힘을 온몸으로 겪었다.
# 파이썬
def move(no, x, y) -> None: # x = 시작 기둥
if no > 1: # y = 목표 기둥
move(no-1, x, 6-x-y) # 6 - x - y = 중간 기둥
print(x, y)
if no > 1:
move(no-1, 6-x-y, y)
number = int(input())
print((2**number)-1)
if number > 20:
exit()
else:
move(number, 1, 3)
재귀 씹새때문에 어지러워
몇가지 예제를 더 풀어보려 한다.
짜잉나 죽겠네
# 팩토리얼
def factorial(n):
if n == 1:
return n * factorial(n-1)
print(factorial(5))
얜 기초라서 바로 보인다
# 1~N까지의 모든 순열 출력
def permute(arr, chosen=[]):
if not arr: # 남은 숫자가 없으면
print(chosen) # 지금까지 고른 숫자들을 출력
return
for i in range(len(arr)): # 남아있는 수 중 하나 고르기
permute(arr[:i] + arr[i+1:], chosen + [arr[i]])
permute([1, 2, 3], [])
이새끼 좀 이해 안됐는데
permute(arr[:i] + arr[i+1:], chosen + [arr[i]])
의 역할을 이해하니 할만했다.
permute([1,2,3], [])
에서 하나씩chosen=[]
으로 옮겨간다.
꼬는 과정↑
arr=[]
이 되면 모든 순열 테스트 해본거니 출력으로 넘어간다.
푸는 과정↑
# 헷갈리는 예시
def explore(level, N, path):
if level == N:
print(path)
return
for i in range(3): # 0,1,2
explore(level+1, N, path+[i])
explore(0, 3, [])
아우 씨발 계속 보다보니 머리 뜨겁네
바람 좀 쐐고 오니 이제 좀 머리가 돌아가네
자꾸 나가서 바람 쐐라는 이유가 있었군만
이 코드의 경우 길이가 N인 리스트를 출력한다. 헷갈린다더니 별 거 없다.