CHAPTER 01 μž¬κ·€ 호좜의 이해

1.1 μž¬κ·€ μ ‘κ·Ό λ°©λ²•μ΄λž€?

μž¬κ·€ν•¨μˆ˜ : 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜ -> 이 과정이 μž¬κ·€

일반적으둜 μž¬κ·€μ—μ„œλŠ” ν•¨μˆ˜μ—μ„œ 전체 μž‘μ—…μ˜ 일뢀뢄을 μˆ˜ν–‰ν•˜κ³ , λ‚˜λ¨Έμ§€ μž‘μ—…μ€ 같은 ν•¨μˆ˜λ₯Ό μž¬κ·€μ μœΌλ‘œ ν˜ΈμΆœν•˜λŠ” λ°©μ‹μœΌλ‘œ 전체 μž‘μ—…μ΄ μˆ˜ν–‰λœλ‹€. μ’…λ£Œ 쑰건에 도달할 λ•ŒκΉŒμ§€ μž¬κ·€ 호좜이 λ°˜λ³΅λœλ‹€.

μž¬κ·€ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œ μ£Όμ˜ν•  점

  1. μž¬κ·€μ—λŠ” 항상 μ’…λ£Œ 쑰건이 μžˆμ–΄μ•Ό ν•œλ‹€. (μ—†μœΌλ©΄ λ¬΄ν•œ 반볡이 λ°œμƒν•˜λ―€λ‘œ)
  2. μž¬κ·€ ν•¨μˆ˜λŠ” 전체 μž‘μ—…μ˜ μΌλΆ€λ§Œ μˆ˜ν–‰ν•˜κ³  λ‚˜λ¨Έμ§€λŠ” μž¬κ·€ ν˜ΈμΆœμ— μœ„μž„ν•œλ‹€.

μ‰¬μš΄ μ½”λ“œμ™€ λ³΅μž‘ν•œ μ½”λ“œ 쀑에 선택해야 ν•œλ‹€λ©΄, μ„±λŠ₯μ΄λ‚˜ λ©”λͺ¨λ¦¬μ˜ 이점이 μžˆμ§€ μ•Šμ€ ν•œ μ‰¬μš΄ μ½”λ“œκ°€ μ’‹λ‹€.

factorial ν•¨μˆ˜λ₯Ό μž¬κ·€/λΉ„μž¬κ·€ ν•¨μˆ˜λ‘œ κ΅¬ν˜„ν•΄λ³΄κΈ°

def recursiveFactorial(n) :
  if n <= 1 :
    return n
  else :
    return recursiveFactorial(n-1) * n

def iterativeFactorial(n) :
  num = 1
  for i in range (2, n+1) :
    num *= i
  return num

ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  λ•Œμ˜ μ£Όμ˜μ‚¬ν•­

  1. ν•¨μˆ˜λŠ” λͺ©μ  지ν–₯적이어야 ν•œλ‹€. μ–΄λ–€ μΈμˆ˜μ— λŒ€ν•΄ ν•¨μˆ˜λŠ” μ˜λ„ν•œ λŒ€λ‘œ λ™μž‘ν•΄μ•Ό ν•œλ‹€.
  2. ν•¨μˆ˜κ°€ μˆ˜ν–‰λ˜λŠ” 데 ν•„μš”ν•œ μ‹œκ°„μ€ 짧을 수둝 μ’‹λ‹€.
  3. ν•¨μˆ˜κ°€ μ‚¬μš©ν•˜λŠ” λ©”λͺ¨λ¦¬μ˜ ν¬κΈ°λŠ” μž‘μ„ 수둝 μ’‹λ‹€.
  4. ν•¨μˆ˜λŠ” μ΄ν•΄ν•˜κΈ° μ‰¬μ›Œμ•Ό ν•œλ‹€. 주석이 없더라도 이해할 수 μžˆμ–΄μ•Ό 이상적인 μ½”λ“œλΌ ν•  수 μžˆλ‹€.

μ„ ν–‰ μž¬κ·€μ™€ ν›„ν–‰ μž¬κ·€

일반적으둜 μž¬κ·€ ν•¨μˆ˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λΆ€λΆ„κ³Ό μžμ‹ μ„ μž¬κ·€ ν˜ΈμΆœν•˜λŠ” λΆ€λΆ„μœΌλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

  • μ„ ν–‰ μž¬κ·€(head recursion) : ν•¨μˆ˜κ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° 전에 μž¬κ·€ ν˜ΈμΆœν•˜λŠ” 경우
  • ν›„ν–‰ μž¬κ·€(tail recursion) : λ§ˆμ§€λ§‰μ— μž¬κ·€ ν˜ΈμΆœν•˜λŠ” 경우

ν›„ν–‰ μž¬κ·€λŠ” 루프λ₯Ό μ‚¬μš©ν•˜λŠ” ν˜•νƒœλ‘œ λ°”κΎΈκΈ° 쉽닀. κ·ΈλŸ¬λ―€λ‘œ ν›„ν–‰ μž¬κ·€λ₯Ό μ‚¬μš©ν•˜μ—¬ μ½”λ“œλ₯Ό μž‘μ„±ν•œ λ‹€μŒμ— 루프λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ”μ§€ κ²€ν† ν•˜κ³  κ°€λŠ₯ν•˜λ©΄ λ°”κΎΈλŠ” 것이 μ’‹λ‹€.

μž¬κ·€λ₯Ό μ‚¬μš©ν•œ 문제 ν•΄κ²°

버블 μ •λ ¬

버블 μ •λ ¬μ—μ„œ n개의 μ›μ†Œλ₯Ό μ •λ ¬ν•˜λŠ” 것과 κ·Έ λ‹€μŒ n-1개 μ›μ†Œλ₯Ό μ •λ ¬ν•˜λŠ” 것은 인수만 λ‹€λ₯Ό 뿐, 같은 λ¬Έμ œλ‹€. κ·ΈλŸ¬λ―€λ‘œ 이 문제λ₯Ό μž¬κ·€ ν•¨μˆ˜λ‘œ ν•΄κ²°ν•˜κΈ° μœ„ν•œ μ •μ˜ 과정을 μ •λ¦¬ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

  • ν•¨μˆ˜κ°€ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” μž‘μ—… : 1회 탐색을 톡해 κ°€μž₯ 큰 μ›μ†Œλ₯Ό 제일 λ’€λ‘œ 보낸닀.
  • 큰 문제λ₯Ό 같은 μœ ν˜•μ˜ μž‘μ€ 문제둜 μ •μ˜ν•˜κΈ° : n개 μ›μ†Œμ˜ μ •λ ¬ = 1회 탐색 + n-1개 μ›μ†Œμ˜ μ •λ ¬
  • μ’…λ£Œ 쑰건 : 탐색 λŒ€μƒμ˜ λ°°μ—΄μ˜ 크기 <= 1
def bubbleSort(arr, n) :
  if (n <= 1) :
    return ;
  
  for i in range(0,n-1) :
    if arr[i] > arr[i+1] : # swap
      temp = arr[i]
      arr[i] = arr[i+1]
      arr[i+1] = temp
  
  bubbleSort(arr, n-1)

arr = [9, 6, 2, 12, 11, 9, 3, 7]
bubbleSort(arr, 8)
print(arr)

μ—°μŠ΅. 숫자 n의 ꡬꡬ단을 좜λ ₯ν•΄λ³΄μž

def printTable(n, i = 9) :
  if (i > 1) :
    printTable(n, i-1)
  return print(f'{n} * {i} = {n * i}')

printTable(5)

# 5 * 1 = 5
# 5 * 2 = 10
# 5 * 3 = 15
# 5 * 4 = 20
# 5 * 5 = 25
# 5 * 6 = 30
# 5 * 7 = 35
# 5 * 8 = 40
# 5 * 9 = 45

1.2 μž¬κ·€ 호좜과 마무리

ν”„λ‘œμ„ΈμŠ€ μ£Όμ†Œ 곡간

ν”„λ‘œμ„ΈμŠ€ μ£Όμ†Œ 곡간 (process address space) : ν”„λ‘œμ„ΈμŠ€κ°€ μ°¨μ§€ν•œ λ©”λͺ¨λ¦¬μ˜ μ˜μ—­μœΌλ‘œ μš΄μ˜μ²΄μ œκ°€ ν• λ‹Ήν•œλ‹€.

μ½”λ“œ 컴파일된 기계어 μ½”λ“œκ°€ μ €μž₯λ˜λŠ” μ˜μ—­, 읽기 μ „μš©μœΌλ‘œ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λ³€κ²½ν•  수 μ—†λ‹€.
ν”„λ‘œκ·Έλž¨μ΄ λ©”λͺ¨λ¦¬μ— 올라갈 λ•Œ 정해진닀.
데이터 λͺ¨λ“  μ „μ—­λ³€μˆ˜μ™€ μ •μ λ³€μˆ˜κ°€ 이 μ˜μ—­μ— 곡간을 ν• λ‹Ήλ°›μœΌλ©°, main ν•¨μˆ˜ 호좜 전에 λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλœλ‹€.
νž™
⬇️

⬆️
μŠ€νƒ
λ™μ μœΌλ‘œ ν• λ‹Ήλ˜λŠ” λ©”λͺ¨λ¦¬λ‘œ 이 λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œλ₯Ό μžƒμ–΄λ²„λ¦¬λ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν•œλ‹€.



ν•¨μˆ˜μ˜ ν™œμ„± λ ˆμ½”λ“œ
기타 λͺ…λ Ήν–‰ 인수, ν™˜κ²½ λ³€μˆ˜ λ“±

λ©”λͺ¨λ¦¬ 배치λ₯Ό μ•Œμž.

ν”„λ‘œκ·Έλž¨ μ‹€ν–‰μ˜ 수λͺ…주기와 ν”„λ‘œκ·Έλž¨μ΄ λ©”λͺ¨λ¦¬μ— μ–΄λ–»κ²Œ λ‘œλ“œλ˜λŠ”μ§€λ₯Ό λͺ…ν™•νžˆ μ΄ν•΄ν•˜λ©΄ μ—¬λŸ¬ 문제λ₯Ό ν‘ΈλŠ” 데 도움이 λœλ‹€.

static int x = strlen('hello');

μœ„ μ½”λ“œλŠ” μ»΄νŒŒμΌν•  λ•Œ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. μ™œ? 정적 λ³€μˆ˜λŠ” λ‘œλ“œνƒ€μž„μ— μ΄ˆκΈ°ν™”λ˜λŠ”λ° ν•¨μˆ˜λŠ” λ‘œλ“œνƒ€μž„μ— ν˜ΈμΆœν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ•Ό ν•œλ‹€.

static int x;
x = strlen('hello');

λ‘œλ“œνƒ€μž„ λ³€μˆ˜λŠ” ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄λ‚˜ 지역 λ³€μˆ˜λ‘œ μ΄ˆκΈ°ν™”ν•  수 μ—†λ‹€.