๊ฐ์
์ฌ๊ท๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ฝ๋์์ ์ฌ๊ท๋ ์๊ธฐ ์์ ์ ํธ์ถํ๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋๋ค.
์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋๋ ๋ฐ๋ณต ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ด๋ค ๋ฐ๋ณต ์๊ณ ๋ฆฌ์ฆ๋ ์ฌ๊ท์ ์ผ๋ก ์์ฑ๋ ์ ์๋ค๋ ๊ฒ์ ์ฆ๋ช ํ๋ ์ฐ๊ตฌ ๋ถ์ผ๊ฐ ์๋ค. ๋ฐ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ณต์ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ ์ํด for ๋ฌธ๊ณผ while ๋ฌธ์ ์ฌ์ฉํ๋ ๋ฐ๋ฉด, ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ๋์ผํ ๋ ผ๋ฆฌ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ ์ํด ํจ์ ํธ์ถ์ ์ฌ์ฉํ๋ค.
1๋ถํฐ 10๊น์ง์ ์ซ์๋ฅผ ์ถ๋ ฅํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๋ค์์ ๋ฐ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์์ฌ ์ฝ๋์ด๋ค:
1
2
3
for (int i = 1; i <= 10; i++) {
print(i)
}
์ฌ๊ธฐ์ ๋๋ฑํ ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์์ฌ ์ฝ๋๊ฐ ์๋ค:
1
2
3
4
5
6
function fn(i):
print(i)
fn(i + 1)
return
fn(1)
๊ฐ๊ฐ์ fn
ํธ์ถ์ ๋จผ์ i
๋ฅผ ์ถ๋ ฅํ๋ค(1๋ถํฐ ์์), ๊ทธ๋ฆฌ๊ณ i
๋ฅผ ์ฆ๊ฐ์ํจ ์ํ๋ก fn
์ ๋ค์ ํธ์ถํ๋ค(๋ค์ ์ซ์๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด).
์ฒซ ๋ฒ์งธ ํจ์ ํธ์ถ์
1
์ ์ถ๋ ฅํ ๋ค์,fn(2)
๋ฅผ ํธ์ถํ๋ค.fn(2)
์์๋2
๋ฅผ ์ถ๋ ฅํ ๋ค์,fn(3)
์ ํธ์ถํ๋ค. ์ด ๊ณผ์ ์ด ๊ณ์๋๋ค.
ํ์ง๋ง ์ด ์ฝ๋๋ ์ฌ์ค ์ด๋๊ฐ ์๋ชป๋์๋ค. ํน์ ๋ฌธ์ ์ ์ด ๋ณด์ด๋๊ฐ? ์ ์ฝ๋๋ ํจ์ ํธ์ถ์ด ์ ๋ ๋ฉ์ถ์ง ์์ ๊ฒ์ด๋ค! ์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด ์์ฐ์(์์ ์ ์)๊ฐ ๋ฌดํํ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค(๋๋ ์ปดํจํฐ๊ฐ ํญ๋ฐํ ๋๊น์ง). ์ ์ฝ๋์์๋ fn(i + 1)
์ด return ์ค๋ณด๋ค ์์ ์ค๊ธฐ ๋๋ฌธ์ return
์ค์๋ ์ ๋ ๋๋ฌํ์ง ์๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ๊ท๊ฐ ๋ฉ์ถ๊ฒ ํ๊ธฐ ์ํ ์ข ๋ฃ ์กฐ๊ฑด์ด ํ์ํ๋ค. ์ข ๋ฃ ์กฐ๊ฑด์ ์ฌ๊ท ํจ์์ ์์ ๋ถ๋ถ์ ์๋ ํธ์ถ์ ์ค๋จํ๋ ์กฐ๊ฑด์ด๋ค.
1
2
3
4
5
6
7
8
9
function fn(i):
if i > 10:
return
print(i)
fn(i + 1)
return
fn(1)
fn(10)
์ ํธ์ถํ ํ, ์ฐ๋ฆฌ๋10
์ ์ถ๋ ฅํ๊ณfn(11)
์ ํธ์ถํ๋ค.fn(11)
ํธ์ถ์์ ์ฐ๋ฆฌ๋ ์ข ๋ฃ ์กฐ๊ฑด์ ์ถฉ์กฑ์์ผ ๋ฐํํ๋ค. ์ด์ ์ฐ๋ฆฌ๋fn(10)
ํธ์ถ๋ก ๋์๊ฐ์ ๋ค์ ์ค, ์ฆ return ๋ฌธ์ผ๋ก ์ด๋ํ๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐfn(9)
ํธ์ถ๋ก ๋์๊ฐ๊ฒ ํ๊ณ , ์ด ๊ณผ์ ์ดfn(1)
ํธ์ถ์์ ๋ฐํํ ๋๊น์ง ๊ณ์๋๋ค.
์ฌ๊ท์ ๋ํด ์ดํดํด์ผ ํ ์ค์ํ ์ฌํญ์ ์ฝ๋๊ฐ ์คํ๋๋ ์์, ์ฆ ์ปดํจํฐ๊ฐ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ์์์ด๋ค. ๋ฐ๋ณต ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ ์ฝ๋ค - ๋งจ ์์์ ์์ํ์ฌ ์ค ๋ณ๋ก ์งํํ๋ค. ์ฌ๊ท์ ๊ฒฝ์ฐ, ํธ์ถ์ด ์๋ก ์์ ์์ผ ์ ์๊ธฐ ๋๋ฌธ์ ํผ๋์ค๋ฌ์ธ ์ ์๋ค. ๋ค์ ์ซ์๋ฅผ ์ถ๋ ฅํ๋, ์ด๋ฒ์๋ 3๊น์ง๋ง ์ถ๋ ฅํด๋ณด์. ๋ ๋ค๋ฅธ print ๋ฌธ์ ์ถ๊ฐํ๊ณ ์ค ๋ฒํธ๋ ๋งค๊ฒจ๋ณด์:
1
2
3
4
5
6
7
8
9
10
function fn(i):
1. if i > 3:
2. return
3. print(i)
4. fn(i + 1)
5. print(f"i = {i}์ธ ํธ์ถ ์ข
๋ฃ")
6. return
fn(1)
์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ถ๋ ฅ์์ ๋ค์์ ๋ณผ ์ ์๋ค:
1
2
3
4
5
6
// 1
// 2
// 3
// i = 3์ธ ํธ์ถ ์ข
๋ฃ
// i = 2์ธ ํธ์ถ ์ข
๋ฃ
// i = 1์ธ ํธ์ถ ์ข
๋ฃ
๋ณด๋ค์ํผ, ํ
์คํธ๋ฅผ ์ถ๋ ฅํ๋ ์ค์ ์ญ์์ผ๋ก ์คํ๋๋ค. ์๋์ fn(1)
ํธ์ถ์ ๋จผ์ 1
์ ์ถ๋ ฅํ ๋ค์, fn(2)
๋ก ์ด๋ํ์ฌ 2
๋ฅผ ์ถ๋ ฅํ๊ณ , ๊ทธ ๋ค์ fn(3)
์ผ๋ก ์ด๋ํ์ฌ 3
์ ์ถ๋ ฅํ ๋ค์, fn(4)
๋ก ์ด๋ํ๋ค. ์ด์ ์ค์ํ ๋ถ๋ถ์ ์ฌ๊ท๊ฐ ์ด๋ป๊ฒ โ์๋กโ โ๋์๊ฐ๋์ง์ด๋ค. fn(4)
๋ ์ข
๋ฃ ์กฐ๊ฑด์ ์ถฉ์กฑ์์ผ ๋ฐํํ๋ค. ์ด์ ์ฐ๋ฆฌ๋ i = 3
์ธ ํจ์ ํธ์ถ๋ก ๋์๊ฐ๊ณ ์ค 4๊ฐ ๋๋ฌ์ผ๋ฏ๋ก ์ค 5๋ก ์ด๋ํ์ฌ "i = 3์ธ ํธ์ถ ์ข
๋ฃ"
๋ฅผ ์ถ๋ ฅํ๋ค. ๊ทธ ์ค์ด ์คํ๋๋ฉด, ์ฐ๋ฆฌ๋ ๋ค์ ์ค๋ก ์ด๋ํ๋๋ฐ, ๊ฑฐ๊ธด return
์ด๋ค. ์ด์ ์ฐ๋ฆฌ๋ i = 2
์ธ ํจ์ ํธ์ถ๋ก ๋์๊ฐ๊ณ ์ค 4๊ฐ ๋๋ฌ์ผ๋ฏ๋ก ๋ค์ ๋ค์ ์ค๋ก ์ด๋ํ์ฌ "i = 2์ธ ํธ์ถ ์ข
๋ฃ"
๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๊ฒ์ ์๋์ fn(1)
ํธ์ถ์ด ๋ฐํ๋ ๋๊น์ง ๋ฐ๋ณต๋๋ค.
๋ชจ๋ ํจ์ ํธ์ถ์ ๋ฐํ๋ ๋๊น์ง โ์กด์ฌโํ๋ค. ๋ค๋ฅธ ํจ์ ํธ์ถ๋ก ์ด๋ํ ๋ ์ด์ ํจ์ ํธ์ถ์ ์๋ก์ด ํจ์ ํธ์ถ์ด ๋ฐํ๋ ๋๊น์ง ๋๊ธฐํ๋ค. ํธ์ถ ์์๋ ๊ธฐ์ต๋๋ฉฐ, ํจ์ ๋ด์ ์ค์ ์์๋๋ก ์คํ๋๋ค.
๊ฐ ํจ์ ํธ์ถ์ ์์ฒด์ ์ธ ๋ก์ปฌ ์ค์ฝํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ์ ์ ์ ์ํด์ผ ํ๋ค. ์์ ์์์, ์ฐ๋ฆฌ๊ฐ
f(3)
์ ํธ์ถํ ๋,i
์ 3๊ฐ์ โ๋ฒ์ โ์ด ๋์์ ์กด์ฌํ๋ค. ์ฒซ ๋ฒ์งธ ํธ์ถ์๋i = 1
์ด ์๊ณ , ๋ ๋ฒ์งธ ํธ์ถ์๋i = 2
๊ฐ ์์ผ๋ฉฐ, ์ธ ๋ฒ์งธ ํธ์ถ์๋i = 3
์ด ์๋ค. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐf(3)
ํธ์ถ์์i += 1
์ ์ํํ๋ค๋ฉด, ๊ทธ๋i
๋4
๊ฐ ๋์ง๋ง, ์ค์งf(3)
ํธ์ถ์์๋ง ๊ทธ๋ ๋ค. ๋ค๋ฅธ ๋ โ๋ฒ์ โ์i
๋ ์๋ก ๋ค๋ฅธ ์ค์ฝํ์ ์๊ธฐ ๋๋ฌธ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
๋ฌธ์ ๋ถ์ํ๊ธฐ
์์ ์ถ๋ ฅ ์์ ๋ ์๋นํ ๋ฌด์๋ฏธํ๋ค. ๋จ์ํ ์ซ์๋ฅผ ์ถ๋ ฅํ๊ณ ์ถ๋ค๋ฉด for ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ฝ๋ค. ์ฌ๊ท๊ฐ ๋น์ ๋ฐํ๋ ๊ณณ์ ๋ฌธ์ ๋ฅผ โํ์ ๋ฌธ์ โ๋ก ๋ถํดํ๊ณ , ๊ทธ ํด๊ฒฐ์ฑ ์ ๊ฒฐํฉํ์ฌ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋์ด๋ค.
ํผ๋ณด๋์น ์์ ๋ํด ์ดํด๋ณด์. ํผ๋ณด๋์น ์๋ 0, 1
๋ก ์์ํ๋ ์ซ์ ์ํ์ค๋ค. ๊ทธ ๋ค์ ๊ฐ ์ซ์๋ ์ด์ ๋ ์ซ์์ ํฉ์ผ๋ก ์ ์๋๋ค. ์ฒ์ ๋ช ๊ฐ์ ํผ๋ณด๋์น ์๋ 0, 1, 1, 2, 3, 5, 8
์ด๋ค. ๋ ํ์์ ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
$F{n}$ = $F_{n - 1}$ + $F_{n - 2}$
์ด๊ฒ์ ์ฌ๊ท ๊ด๊ณ ํน์ ์ ํ์์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค - ํญ๋ชฉ๋ค์ ์๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ์ ์์ด๋ค.
ํผ๋ณด๋์น ์์ด์ $n$๋ฒ์งธ ์๋ฅผ ๋ฐํํ๋ ํจ์ F(n)
์ ์์ฌ์ฝ๋๋ก ์์ฑํด๋ณด์. ์ฌ๊ท ํจ์์ ํจ๊ป ์ข
๋ฃ ์กฐ๊ฑด์ ์์ง ๋ง์์ผ ํ๋ค. ์ด ๊ฒฝ์ฐ ์ข
๋ฃ ์กฐ๊ฑด์ ๋ช
์์ ์ผ๋ก ์ ์๋์ด ์๋ค: F(0) = 0
๊ณผ F(1) = 1
.
1
2
3
4
5
6
7
function F(n):
if n <= 1:
return n
oneBack = F(n - 1)
twoBack = F(n - 2)
return oneBack + twoBack
F(3)
์ ์ฐพ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด๋ณด์. F(3)
์ ํธ์ถํ๋ฉด ๊ฐ ๋ค์ฌ์ฐ๊ธฐ ์์ค์ด ํจ์ ํธ์ถ์ ๋ฒ์๋ฅผ ๋ํ๋ด๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ ๋ณผ ์ ์๋ค:
1
2
3
4
5
6
7
8
9
oneBack = F(2)
oneBack = F(1)
F(1) = 1
twoBack = F(0)
F(0) = 0
F(2) = oneBack + twoBack = 1
twoBack = F(1)
F(1) = 1
F(3) = oneBack + twoBack = 2
๋ณด๋ค์ํผ, ์๋ ๋ฌธ์ F(3)
์ ๋ ๊ฐ์ ๋ ์์ ํ์ ๋ฌธ์ , ์ฆ F(2)
์ F(1)
๋ก ๋ถํดํ๋ค. ์ ํ์๊ณผ ์ข
๋ฃ ์กฐ๊ฑด์ ๊ฒฐํฉํจ์ผ๋ก์จ, ์ฐ๋ฆฌ๋ ํ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๊ทธ ํด๊ฒฐ์ฑ
์ ์ฌ์ฉํ์ฌ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ฒ ๋์๋ค.
์ด๊ฒ์ด ์ฌ๊ท์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด๋ค - ์ฌ๊ท ํจ์๊ฐ ์ฃผ์ด์ง ์ ๋ ฅ์ ๋ํด ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ์ ๋ต์ ๋ฐํํ๋๋ก ํ๋ค. ์ด ์์์, ์ฐ๋ฆฌ๊ฐ ์ฃผ์ด์ง ์ ๋ ฅ์ ๋ํด ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ๋ โ$n$๋ฒ์งธ ํผ๋ณด๋์น ์๋ ๋ฌด์์ธ๊ฐ?โ์ด๋ค. ๋ฐ๋ผ์, ์ฐ๋ฆฌ๋ ํจ์๊ฐ ์ ๋ ฅ $n$์ ๋ฐ๋ผ ํผ๋ณด๋์น ์๋ฅผ ๋ฐํํ๋๋ก ์ค๊ณํ๋ค. ์ข ๋ฃ ์กฐ๊ฑด๊ณผ ์ ํ์์ ๊ฒฐ์ ํจ์ผ๋ก์จ, ์ฐ๋ฆฌ๋ ํจ์๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
์ด ์์ด๋์ด๋ฅผ ๋ฐ๋ฅด๋ฉด, ํ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ์ฝ๋ค - 100๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ์ํ๋ค๋ฉด, ๊ทธ๊ฒ์ด 99๋ฒ์งธ์ 98๋ฒ์งธ ํผ๋ณด๋์น ์์ ํฉ์์ ์ ์์ ์ํด ์๊ณ ์๋ค. F(100)
์ ๋ํ ํจ์ ํธ์ถ์์, F(99)
์ F(98)
์ ํธ์ถํ๋ฉด ๊ทธ ์ซ์๋ค์ ์ป์ ๊ฒ์์ ์ ์ ์๋ค.
์ถ์ฒ: Leetcode