ํ๋์ ํจ์์์ ์๊ธฐ ์์ ์ ๋ค์ ํธ์ถํด ์์ ์ ์ํํ๋ ์๊ณ ๋ฆฌ์ฆ
์ฌ๊ท๋ก N๋ถํฐ 1๊น์ง ์ถ๋ ฅํ๋ ํจ์์ 1๋ถํฐ N๊น์ง์ ํฉ์ ๊ตฌํ๋ ํจ์ ์ง๋ณด๊ธฐ
import sys
def print_recur(n):
if n<0:
return
print(n)
n-=1
print_recur(n)
def summ(n):
if n<0:
return 0
else:
return n+summ(n-1)
n=int(sys.stdin.readline())
print_recur(n)
sres=summ(n)
print(sres)
-> ์ฌ๊ธฐ์ ๊ท๋ฉ์ ์ธ ๊ฒ์ ์์๊ณผ๋ ํฐ ์ฐจ์ด๊ฐ ์๋ค.
n๋ถํฐ 1๊น์ง ์ฐจ๋ก๋ก ์ถ๋ ฅํ๋ ํจ์(func1)๋ฅผ ์ํ์ ๊ท๋ฉ๋ฒ์ผ๋ก ์ค๋ช
ํ๋ฉด
func(1)์ด 1์ ์ถ๋ ฅํ๋ฉด func(k)๊ฐ k,k-1,k-2, ... 1์ ์ถ๋ ฅํ๋ฏ๋ก func(k+1)์ k+1๋ถํฐ 1๊น์ง ์ฐจ๋ก๋๋ก ์ถ๋ ฅํ๋ค.
-> ์ด๋ func(k+1)์ด ํธ์ถ๋์์ ๋ k+1์ด ์ถ๋ ฅ๋ ํ k๋ถํฐ 1๊น์ง ์ถ๋ ฅํ๋ func(k)๋ฅผ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๋ ๋ฌธ์ฅ์ด ์ฐธ์ด๋ฏ๋ก ๊ท๋ฉ์ ๋ฐฉ์์ผ๋ก ์ธํด func()๊ฐ n๋ถํฐ 1๊น์ง ์ฐจ๋ก๋ก ์ถ๋ ฅํ๋ ํจ์์ธ ๊ฒ์ ์ ์ ์๋ค.
ํน์ ์
๋ ฅ์ ๋ํด์๋ ์๊ธฐ ์์ ์ ํธ์ถํ์ง ์๊ณ ์ข
๋ฃ๋์ด์ผ ํ๋ค.
๋ชจ๋ ์
๋ ฅ์ base condition(base case)์ผ๋ก ์๋ ดํด์ผํ๋ค.
ex) n=0์ผ ๋ ์๊ธฐ ์์ ์ ํธ์ถํ์ง ์๊ณ ์ข
๋ฃ๊ฐ ๋๋ ์ด๊ฒ์ด base condition์ด๋ค.

๊ตฌํ์ ํ ๋ 3๊ฐ์ง๋ฅผ ์ง์ผ์ผ ํ๋ค.
1. ํจ์์ ์ ์
2. base condition
3. ์ฌ๊ท ์

import sys
a,b,c=map(int,sys.stdin.readline().split())
def recur(a,b):
if b==1:
return a%c
else:
tmp=recur(a,b//2)
if b%2==0: #base condition
return (tmp * tmp )%c
else: #base condition
return (tmp * tmp*a)%c
print(recur(a,b))
๋ง์ฝ a^10์ผ ๋, (a^5) x (a^5)์ ๊ฐ๋ค.
b๊ฐ 11๊ฐ์ ํ์ ์ผ๊ฒฝ์ฐ (a^b/2) x (a^b/2) x a์ด๋ค.
์๊ฐ ๋ณต์ก๋๊ฐ ์ ๋ฐ์ฉ ๊น์ด๊ธฐ ๋๋ฌธ์ O(logb)์ด๋ค.
import sys
k=int(sys.stdin.readline())
# 2 ๋ฒ ์ํ์ด ๊ฐ๋ ค๋ฉด ์ด๋์ด 3๋ฒ์ด ํ์ํ๊ณ
# 3 ๋ฒ ์ํ์ด ๊ฐ๋ ค๋ฉด ์ด๋์ด 7๋ฒ ํ์ํ๋ค.
# ์ฎ๊ธด ํ์๋ 2k+1
# N ๋ฒ์งธ ์ํ์ด ๊ฐ๋ ค๋ฉด N-1๋ฒ๊น์ง์ ์ํ์ด ๋จผ์ ๊ธฐ๋ฅ 2์ ๊ฐ์ผํ๋ค
# N ๋ฒ์งธ ์ํ์ ๊ธฐ๋ฅ 3์ ์ฎ๊ธฐ๊ณ ๋ค์ n-1์ํ์ ๊ธฐ๋ฅ 3์ผ๋ก ์ฎ๊ธด๋ค.
# ์ํ์ด 1๊ฐ๋ฉด ์ํ๋ ๊ณณ์ ์ฎ๊ธธ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด K+1๊ฐ๋ ๋ด๊ฐ ์ฎ๊ธธ ์ ์๋ค.
def hanoi(a,b,n):
# ์ํ N๊ฐ๋ฅผ ๊ธฐ๋ฅ a์์ b๋ก ์ฎ๊ธฐ๋ ๋ฐฉ๋ฒ์ ์ถ๋ ฅํ๋ ํจ์
"""
์ฌ๊ท์
n-1๊ฐ์ ์ํ์ ๊ธฐ๋ฅ a์์ ๊ธฐ๋ฅ 6-a-b๋ก ์ฎ๊ธด๋ค
n๋ฒ์ ์ํ์ ๊ธฐ๋ฅ a์์ ๊ธฐ๋ฅ b๋ก ์ฎ๊ธด๋ค.
n-1๊ฐ์ ์ํ์ ๊ธฐ๋ฅ 6-a-b์์ ๊ธฐ๋ฅ b๋ก ์ฎ๊ธด๋ค.
"""
if n==1:
print(a,b)
return
hanoi(a,6-a-b,n-1)
print(a,b)
hanoi(6-a-b,b,n-1)
print(2**k-1)
hanoi(1,3,k)
import sys
def recur(n,r,c):
if n==0:
return 0
half=2**(n-1) # 4๊ฐ์ง๋ฆฌ ์ฌ๊ฐํ ๋ช๊ฐ ์ธ์ง
if r<half and c<half: # ์ผ์ชฝ ์
return recur(n-1,r,c)
if r<half and c>=half: # ์ค๋ฅธ์ชฝ ์
return (half*half)+recur(n-1,r,c-half)
if r>=half and c<half: # ์ผ์๋
return (2*half*half)+recur(n-1,r-half,c)
else: # ์ค๋ฅธ ์๋
return (3*half*half)+recur(n-1,r-half,c-half)
n,r,c=map(int,sys.stdin.readline().split())
print(recur(n,r,c))
์ฌ๊ท(Recursion)๋ ํฐ ๋ฌธ์ ๋ฅผ ๋์ผํ ์ ํ์ ๋ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํ๋ ๋ฐฉ์์
๋๋ค.
์ฌ๊ท ํจ์๋ ์๊ธฐ ์์ ์ ํธ์ถํ์ฌ ๋ฐ๋ณต์ ์ผ๋ก ๋ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ์ด ๊ณผ์ ์ ํตํด ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๋จ์ํ ๊ฐ๋ ๊ฐ์ง๋ง, ์ฌ๊ท๋ ์์ ํ์, ๋์ ๊ณํ๋ฒ(DP), ๊ทธ๋ํ ํ์(DFS), ํธ๋ฆฌ ์ํ ๋ฑ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์์ ํต์ฌ ๋๊ตฌ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
Base Case๊ฐ ์์ผ๋ฉด ์ฌ๊ท๋ ๋ฌดํํ ํธ์ถ๋์ด StackOverflowError(RecursionError)๊ฐ ๋ฐ์ํฉ๋๋ค.
2-1. ํฉํ ๋ฆฌ์ผ (factorial)
ํฉํ ๋ฆฌ์ผ์ 1๋ถํฐ n๊น์ง์ ์ ์๋ฅผ ๊ณฑํ ๊ฐ์
๋๋ค.
public static int factorial(int n) {
if (n == 1) { // Base Case
return 1;
}
return n * factorial(n - 1); // Recursive Call
}
์คํ ๊ณผ์ ์์
factorial(4)๋ฅผ ํธ์ถํ๋ฉด:
factorial(4) -> 4 * factorial(3)
factorial(3) -> 3 * factorial(2)
factorial(2) -> 2 * factorial(1)
factorial(1) -> 1 (Base Case)
2-2. ํผ๋ณด๋์น (fibonacci)
ํผ๋ณด๋์น ์์ด์ ์ ๋ ํญ์ ํฉ์ด ๋ค์ ํญ์ด ๋๋ ์์ด์
๋๋ค.'

public static int fibo(int n) {
if ((n == 1) || (n == 2)) {
return 1;
}
return fibo(n - 1) + fibo(n - 2);
}
fibo(5) -> fibo(4) + fibo(3)
fibo(4) -> fibo(3) + fibo(2)
fibo(3) -> fibo(2) + fibo(1) = 1 + 1
์ฌ๊ท์ ์๊ฐ๋ณต์ก๋๋ ์ ํํ ๊ณ์ฐํ๊ธฐ ์ด๋ ต์ง๋ง, ๋๋ต์ ์ผ๋ก๋
์ฌ๊ท ํจ์ ํธ์ถ ์ ร (์ฌ๊ท ํจ์ ํ๋๋น ์๊ฐ๋ณต์ก๋)๋ก ๊ณ์ฐํ ์ ์์ต๋๋ค.


public static void dfs(int cur) {
visited[cur] = true;
for (int next : graph.get(cur)) {
if (!visited[next]) {
dfs(next);
}
}
}
if (!visited[next]) ์กฐ๊ฑด๋ฌธ์ ์ฌ๊ท ํธ์ถ์ ์ ํํ๋ ํํฐ ์ญํ ์ ํฉ๋๋ค.
๋ฐฉ๋ฌธ๋์ง ์์ ๋ ธ๋๋ง ์ฌ๊ท ํธ์ถํ๋๋ก ์ ์ดํ๋ฏ๋ก, ๋ฌดํ ๋ฃจํ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
ํ์ง๋ง ์ด ์กฐ๊ฑด์ด ๋ช ์์ ์ธ ๊ธฐ์ ์กฐ๊ฑด์ ์๋๋ฏ๋ก, ๊ธฐ์ ์กฐ๊ฑด์ผ๋ก ๊ฐ์ฃผํ๊ธด ์ด๋ ต์ต๋๋ค.
์ฌ๊ท ๊น์ด๋ฅผ ๋๋ฌด ํฌ๊ฒ ์ค์ ํ์ง ๋ง ๊ฒ
์ฌ๊ท ๊น์ด๊ฐ ๋๋ฌด ํฌ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ(OutOfMemoryError)๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ 10,000 ์ ๋๋ฉด ์ถฉ๋ถํฉ๋๋ค.
๋์์ด ์๋์ง ๊ณ ๋ ค
์
๋ ฅ ํฌ๊ธฐ๊ฐ ์ฌ๊ท ์ ํ์ ์ด๊ณผํ๋ค๋ฉด, ๋ฐ๋ณต๋ฌธ ๋ฑ ๋ค๋ฅธ ํ์ด๋ฅผ ์๋ํด ๋ณด๋ ๊ฒ๋ ์ข์ ์ ํ์
๋๋ค.
๋ฐ๋ณต๋ฌธ์ ํ์ฉํ ์ ์๋ค๋ฉด, ์ฌ๊ท ๋์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ ํ๊ณ ํจ์จ์ ์
๋๋ค.