Skip to content

Latest commit

ย 

History

History

Recursion

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
ย 
ย 
ย 
ย 
ย 
ย 

Recursion

๋งŽ์€ ์ผ๋“ค์€ ๋Œ€๊ฐœ ์ž‘์€ ์กฐ๊ฐ๋“ค๋กœ ๋‚˜๋ˆ„์–ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ ์กฐ๊ฐ์ด ์ž‘์œผ๋ฉด ์ž‘์„์ˆ˜๋ก ์ผ์€ ๋‹จ์ˆœํ•ด์ง€๊ณ  ๋ฐ˜๋ณต๋˜๋Š” ํ˜•ํƒœ๋ฅผ ๋„๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•˜๋Š” ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด ์ด๋•Œ ์žฌ๊ท€ ํ•จ์ˆ˜(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)
  }
}

์—ญ์‹œ ๋ฐ˜๋ณต์ด ๋งŽ์•„์ง€๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณธ๋‹ค๋ฉด ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.