n : 1 x 2 x ... x n-1 x n
def fact1(n):
f = 1
for i in range(1, n+1):
f = f * i
return f
1! = 1
2! = 1 x 2 = 2 x 1!
3! = 1 x 2 x 3 = 3 x 2!
n! = 1 x 2 x ... x (n-1) x n = n x (n-1)!
def fact2(n):
if n<=1: # 종료 조건
return 1
return n * fact(n-1)
ex) fact2(4)
-> 4! = 4 x 3! = 4 x 3 x 2! = 4 x 3 x 2 x 1! = 4 x 3 x 2 = 4 x 6 = 24
모두 O(n)
def sum_n(n):
if n == 1:
return 1
return n + sum_n(n-1)
print(sum_n(3))
def find_max(a, n):
if n == 1:
return a[0]
max_n = find_max(a, n-1)
if max_n > a[n-1]:
return max_n
else:
return a[n-1]
v = [17, 92, 18, 33, 58, 7, 33, 42]
print(find_max(v, len(v)))
def gcd(a, b):
i = min(a,b)
while True:
if a % i == 0 and b % i == 0:
return i
i = i - 1
- a와 b의 최대공약수는 b와 a%b의 나머지의 최대공약수와 같다
- gcd(a,b) = gcd(b, a%b)
- 어떤 수와 0의 최대공약수는 자기 자신임 -> 종료조건
- gcd(n, 0) = n
ex) gcd(60, 24) = gcd(24, 12) = gcd(12, 0) = 12
def gcd(a,b):
if b == 0:
return a
return gcd(b, a%b)
def pibo(n):
if n <= 1:
return n
return pibo(n-1) + pibo(n-2)
- 크기가 다른 원반 n개를 출발 기둥에서 도착 기둥으로 이동
- 원반은 한 번에 한 개만 이동 가능
- 원반을 옮길 때는 원반의 맨 위의 것만 이동 가능
- 큰 원반이 작은 원반 위로 갈 수 없음.
def hanoi (n, from_pos, to_pos, aux_pos):
if n ==1:
print("출발:", from_pos)
print("->")
print("도착:", to_pos)
return
hanoi(n-1, from_pos, aux_pos, to_pos)
print("출발:", from_pos)
print("->")
print("도착:", to_pos)
hanoi(n-1, aux_pos, to_pos, from_pos)
hanoi(3, 1, 3, 2)
hanoi(n-1, from_pos, aux_pos, to_pos)
: n-1개 원반을 보조 기둥으로 이동hanoi(n-1, aux_pos, to_pos, from_pos)
: 보조 기둥에 있는 n-1개의 원반을 목적지 기둥으로 이동.성능 : O(2^n)
import turtle as t
def spiral(sp_len):
if sp_len <= 5:
return
t.forward(sp_len)
t.right(90)
spiral(sp_len - 5)
t.speed(0)
spiral(200)
t.hideturtle()
t.done()
import turtle as t
def tri(tri_len):
if tri_len <= 10:
for i in range(0, 3):
t.forward(tri_len)
t.left(120)
return
new_len = tri_len / 2
tri(new_len)
t.forward(new_len)
tri(new_len)
t.backward(new_len)
t.left(60)
t.forward(new_len)
t.right(60)
tri(new_len)
t.left(60)
t.backward(new_len)
t.right(60)
t.speed(0)
tri(160)
t.hideturtle()
t.done()
import turtle as t
def tree(br_len):
if br_len <= 5:
return
new_len = br_len * 0.7
t.forward(br_len)
t.right(20)
tree(new_len)
t.left(40)
tree(new_len)
t.right(20)
t.backward(br_len)
t.speed(0)
t.left(90)
tree(70)
t.hideturtle()
t.done()
import turtle as t
def snow(snow_len):
if snow_len <= 10:
t.forward(snow_len)
return
new_len = snow_len / 3
snow(new_len)
t.left(60)
snow(new_len)
t.right(120)
snow(new_len)
t.left(60)
snow(new_len)
t.speed(0)
snow(150)
t.right(120)
snow(150)
t.right(120)
snow(150)
t.hideturtle()
t.done()