๋ง์ ์ผ๋ค์ ๋๊ฐ ์์ ์กฐ๊ฐ๋ค๋ก ๋๋์ด ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ ์กฐ๊ฐ์ด ์์ผ๋ฉด ์์์๋ก ์ผ์ ๋จ์ํด์ง๊ณ ๋ฐ๋ณต๋๋ ํํ๋ฅผ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์์ ํ ๊ฐ์ ์ฝ๋๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ๋ ์์ ์ด ์๋ค๋ฉด ์ด๋ ์ฌ๊ท ํจ์(recursion fnction), recursion(์ฌ๊ท ํธ์ถ)์ด ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
1~100๊น์ง์ ํฉ์ ๊ตฌํ๋ ๊ฒฝ์ฐ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์๊ฐํด๋ด ์๋ค.
1 ~ 100๊น์ง์ ํฉ์ 100 + 1 ~ 99๊น์ง์ ํฉ์ผ๋ก ๋๋ ์ ์๊ฐํ ์ ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก 1 ~ 99๊น์ง์ ํฉ์ 99 + 1 ~ 98๊น์ง์ ํฉ์ผ๋ก ๋ณผ ์ ์๊ฒ ์ฃ . "n + 1~n-1๊น์ง์ ํฉ" ์ด๋ผ๋ ๊ณผ์ ์ ์๋ฒฝํ๊ฒ ๋์ผํฉ๋๋ค. ์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํด๋ณด๋ฉด,
func sum(_ n: Int) -> Int {
if n == 1 { return 1 }
return n + sum(n-1)
}
n์ด ์๋ฌด๋ฆฌ ์ปค์ง๋๋ผ๋ ๋ช ์ค์ ์ฝ๋๋ก ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค. n์ด ์ปค์ง๋ฉด ์ปค์ง์๋ก ์ฌ๊ทํจ์๋ ๋์ฑ ํจ์จ์ ์ด๊ฒ ์ฃ . ์ด๋ ์ฃผ๋ชฉํ ๊ฑด ์ฒซ ์ค์ if๋ฌธ์ ๋๋ค. n์ด 1์ผ ๋ 1์ ๋ฆฌํดํด์ฃผ์ง ์์ผ๋ฉด ์ด ๋ฐ๋ณต๋ฌธ์ ๋๋์ง ์์ต๋๋ค. ์ด์ฒ๋ผ ์ฌ๊ท ํจ์๊ฐ ๊ฐ์ฅ ์์ ๋จ๊ณ๊น์ง ๊ฐ์ ๋ ์ด์ ์ชผ๊ฐ์ง์ง ์๊ณ ์ข ๋ฃ๋๋ ์ฌ๊ท ํธ์ถ์ ๊ธฐ์ ์ฌ๋ก(base case) ๋ผ๊ณ ํฉ๋๋ค.
๊ธฐ์ ์ฌ๋ก๋ฅผ ์ ํํ ๋๋ ์กด์ฌํ๋ ๋ชจ๋ ์ ๋ ฅ์ด ํญ์ ๊ธฐ์ ์ฌ๋ก์ ๋ต์ ์ด์ฉํด ๊ณ์ฐ๋ ์ ์๋๋ก ํด์ผํฉ๋๋ค. (๊ฐ์ฅ ์์ ์กฐ๊ฐ์ ์ ํํด์ผ ๋ฉ๋๋ค.) ์ ๊ฒฝ์ฐ์์ n์ด 1์ธ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ n์ด 2์ธ์ง ํ์ธํด์ 3์ ๋ฆฌํดํ๋ฉด 2๋ณด๋ค ํฐ ๊ฒฝ์ฐ๋ ์ ๋์ํ๊ฒ ์ง๋ง 2๋ณด๋ค ์์์ง๋ ๊ฒฝ์ฐ๋ ๋ฌธ์ ๊ฐ ์๊น๋๋ค.
๋ชจ๋ ๋ฐ๋ณต๋ฌธ์ ์ฌ๊ท ํจ์๋ก ๋ง๋ค ์ ์์ต๋๋ค. ๋น์ฐํ ๊ทธ ์ญ๋ ์ฑ๋ฆฝํ์ง์. 0๋ถํฐ ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง n๊ฐ์ ์์ ์ค 4๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์? 4์ค for๋ฌธ์ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค.
for i in 0..<n {
for j in i..<n {
for k in j..<n {
for l in k..<n {
print("(\(i), \(j), \(k), \(l)")
}
}
}
}
ํ์ง๋ง 5๊ฐ, 10๊ฐ, 100๊ฐ๋ฅผ ๊ณจ๋ผ์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์ฒ์ฐธํ ์ํฉ์ ๋ง๊ธฐ ์ํด ์ฌ๊ท์ ์ผ๋ก ๋ฐ๊ฟ๋ณด์ฃ . ๋จผ์ for๋ฌธ์ด ํ๋ ์ผ๋ถํฐ ์๊ฐํด๋ณผ๊น์? ์ํ๋ ๋งํผ ์๋ฅผ ์ ํํ์ผ๋ฉด ์ถ๋ ฅํฉ๋๋ค. ๋์ ๋๋ค.
์ด์ ๋ฐ๋ณต์ ์ํด ๋ฌด์์ด ํ์ํ์ง ์๊ฐํด๋ณผ๊น์?
- ์์๋ค์ ์ด ๊ฐ์
- ๋ ๊ณจ๋ผ์ผํ๋ ์
- ์ง๊ธ๊น์ง ๊ณ ๋ฅธ ์
์ด์ ๋ง์ง๋ง์ผ๋ก ๊ธฐ์ ์ฌ๋ก๋ฅผ ์๊ฐํด๋ด ์๋ค.
- ์ํ๋ ๋งํผ ์ ํ๋๋์ง ํ์ธํฉ๋๋ค. --> ๋ ์ด์ ์ ํํ ์ ์๋ ์๊ฐ ์๋ ๊ฒฝ์ฐ๋ก ์๊ฐํ ์ ์์ต๋๋ค.
์ด์ ์ด๋ฅผ ๊ตฌํํด๋ณด๋ฉด,
for pick(n: Int, picked: [Int], toPick: Int) {
if toPick == 0 { return print("\(picked)") }
// ๊ณ ๋ฅผ ์ ์๋ ๊ฐ์ฅ ์์ ์
let smallest = picked.isEmpty ? 0 : picked.last! + 1
// ๊ฐ์ฅ ์์ ์ ๋ถํฐ ๊ณ ๋ฅผ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ถ๋ ฅ
for s in s..<n {
var newPicked = picked
newPicked.append(s)
pick(n: n, picked: newPicked, toPick: toPick -1)
}
}
์ญ์ ๋ฐ๋ณต์ด ๋ง์์ง๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณธ๋ค๋ฉด ๋งค์ฐ ๊ฐ๋จํ ์ฝ๋๋ก ๊ตฌํํ ์ ์์ต๋๋ค.