본문 바로가기

Swift Algorithms

3. Factorials & Recursion

Factorial

Factorials란 어떤 정수까지의 곱을 말한다 예를 들어 3까지의 곱이라면 1X2X3 = 6이고 5까지의 곱이라면 1X2X3X4X5 = 120을 말한다.

Factoial의 중요한점은 Factoial 0의 값은 1이다 (1 Factoial의 값은 당연히 1)

func factorialOfValue(value : Int) -> Int {
    
    if value == 0 {
        return 1
    }
    
    var product : Int = 1
    for i in 1...value {
        product = product * i
    }
    return product
}

factorialOfValue(value: 3)
factorialOfValue(value: 5)

위 예제에서 value 값을 3을 넣으면 3은 == 0과 같지 않기 때문에 for in 구문이 실행되고 1... 3 반복문이 실행된다. 

변수 product는 1이기 때문에 1 = 1 X 1이 실행되고 product는 1이 된다 -> 다음 반복에서 product = 1 이기 때문에 1 = 1 X 2 가 실행되고 product는 2가 된다 -> product는 2이기 때문에 2 = 2 X 3이 실행되고 product는 6으로 반복문이종료되고 값은 6이 나온다.

만약 value의 값이 0이라면 if 에서 걸러져 값 1을 리턴해준다

Recursion

한국말로 재귀 함수라고도 불리며 자기 자신을 호출하는 함수, 메서드입니다.

무한루프에 빠질 수 있기 때문에 종료 조건을 꼭 걸어주어야 한다

func recursiveFactoria10Value (_ value : Int) -> Int {
    
    if value == 0 {
        return 1
    }
    
    print(value)
    
    return value * recursiveFactoria10Value(value - 1)

}

recursiveFactoria10Value(3)

recursiveFactoria10 Value 함수에 value 3을 넣으면 value 3 == 0 이 아니기 때문에 3 X recursiveFactoria10 Value(value - 1) 가 실행되고 recursiveFactoria10Value(value - 1) 함수이기 때문에 value -1 인 2를 넣고 다시 실행합니다. (recursiveFactoria10Value(2) 의 값은 모름)

value 2 == 0 아니기 때문에 2 X recursiveFactoria10Value(value - 1)가 실행되고 recursiveFactoria10Value(value - 1) 함수이기 때문에 value -1 인 1을 넣고 다시 실행합니다. (recursiveFactoria10 Value(1)의

value 1 == 0 아니기 때문에 1 X recursiveFactoria10 Value(value - 1)가 실행되고 recursiveFactoria10Value(value - 1) 함수이기 때문에 value -1 인 0을 넣고 다시 실행합니다. (recursiveFactoria10 Value(0)의 값은 모름)

value == 0이기 때문에 리턴 1을 실행하고 recursiveFactoria10Value(0) 의 값은 1 이란 걸 알게 되었기 때문에 1 X 1 -> 2 X 2 -> 3 X 2로 몰랐던 recursiveFactoria10 Value(1, 2, 3)의 값들이 풀리면서 6이 됩니다.

 

재귀 함수는 for, while 문으로 대체가 가능하지만 배열 안의 배열 같은 경우에는 재귀 함수가 더 적합하고 간결하게 작성 가능

그러나 재귀 함수는 부를 때마다 메모리에 스택이 쌓여 for, while에 비해 시간이 더 오래 걸림

'Swift Algorithms' 카테고리의 다른 글

6. Fibonacci Sequence  (0) 2020.07.03
5. Reverse every other word  (0) 2020.07.03
4. Most Common Name in Array  (0) 2020.07.02
2. Binary Search  (0) 2020.06.23
1. Fizz Buzz  (0) 2020.06.22