스위프트 문법 8 (재귀)

스위프트 문법 8 (재귀)

- 5 mins

Recursion (재귀)

자기 자신을 재참조하는 함수

 어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.
 - 학생 : "재귀함수가 뭔가요?"
 - 교수 : "잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.
         마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.
         그의 답은 대부분 옳았다고 하네.
         그런데 어느날, 그 선인에게 한 선비가 찾아와서 물었어."
 
         "재귀함수가 뭔가요?"
         "잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어...
          마을 사람들은 ...."

재귀함수는 함수 내에서 자기 자신을 다시 호출해 다시 실행하게 한다.

count = 0

func recursiveFunction() {
  guard count != 5 else { return }
  count += 1
  print(count)
  
  recursiveFunction()   // <-------- 여기서 함수를 다시 호출하여 재귀
  print("lastline", count)
}

recursiveFunction()

재귀를 이용한 팩토리얼(Factorial) 구현

Factorial Example index : 1, 2, 3, 4, 5, 6, 7, 8, 9, … number : 1, 2, 6, 24, 120, 720, 5040, , 40320, 362,880, …

func factorialRecursiveFunction(N: Int) -> Int {
  guard N > 1 else { return N }
  return N * factorialRecursiveFunction(N: N - 1)
}

factorialRecursiveFunction(N: 3)
factorialRecursiveFunction(N: 5)
factorialRecursiveFunction(N: 7)
factorialRecursiveFunction(N: 9)

//---------------------------------------------------------------------
//for문을 이용한 피보나치
func factorialLoop(N: Int) -> Int {
  var sum = 1
  for idx in 1...N {
    sum *= idx
  }

  return sum
}

factorialLoop(N: 3)
factorialLoop(N: 5)
factorialLoop(N: 7)
factorialLoop(N: 9)

재귀를 이용한 피보나치(Fibonacci) 구현

Fibonacci Example index : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, … number : 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

func fibonacciRecursiveFunction(N: Int) -> Int {
  guard N > 2 else { return N - 1 }
  return fibonacciRecursiveFunction(N: N - 1) + fibonacciRecursiveFunction(N: N - 2)
}


fibonacciRecursiveFunction(N: 1)
fibonacciRecursiveFunction(N: 2)
fibonacciRecursiveFunction(N: 3)
fibonacciRecursiveFunction(N: 4)
fibonacciRecursiveFunction(N: 5)

fibonacciRecursiveFunction(N: 10)
fibonacciRecursiveFunction(N: 11)
fibonacciRecursiveFunction(N: 12)

//---------------------------------------------------------
//for문을 이용한 피보나치 구현
func fibonacciLoop(N: Int) -> Int {
  guard N > 1 else { return N }
  var num1 = 0, num2 = 1
  
  for i in 1 ..< N {
    switch i % 2 {
    case 0:
      num1 = num1 + num2
    default:
      num2 = num1 + num2
    }
  }
  
  return num1 > num2 ? num1 : num2
}

fibonacciLoop(N: 2)
fibonacciLoop(N: 3)
fibonacciLoop(N: 4)
fibonacciLoop(N: 5)

fibonacciLoop(N: 10)
fibonacciLoop(N: 11)
fibonacciLoop(N: 12)

Recursive Enumerations

자기 자신을 참조하는 Enumeration 형식

enum을 선언할때 indirect을 입력하여 자신을 참조할것이라고 표기해야합니다.

indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}

let five = ArithmeticExpression.number(5)              
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))

func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .multiplication(left, right):
        return evaluate(left) * evaluate(right)
    }
}

evaluate(sum)           //9
evaluate(product)       //18
comments powered by Disqus
rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora