본문 바로가기

Swift Algorithms

6. Fibonacci Sequence

Fibonacci Sequence

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144와 같이 앞의 두 수의 합이 뒤의 수가 되는 수의 배열

func fibForNumSteps(_ numSteps : Int) -> [Int] {
    var sequence = [0, 1]

    if numSteps <= 1 {
        return sequence
    }

    for _ in 0...numSteps - 2 {
        let first = sequence[sequence.count - 2]
        let second = sequence.last!
        sequence.append(first + second)
    }

    return sequence
}
fibForNumSteps(8)
//[0, 1, 1, 2, 3, 5, 8, 13, 21]

 

만약 피보나치수열에서 첫 번째나 두 번째 경우까지 반환할 경우 0, 1이기 때문에 조건문에서 1 이하의 수는 변수 sequence에 있는 [0, 1]을 반환시킵니다.

1 이상일 경우 for in 구문이 실행되고 sequence 배열의 가장 첫 번째가 0이기 때문에 sequence.count (2 - 2)로 sequence의 배열 index [0]인 0과 그 뒤 숫자 1을 sequence.last로 불러온 뒤 first + second를 합친 수를 sequence의 배열에 추가시킵니다. 

sequence 배열은 [0, 1, 1] 이 되고 다시 for in 구문의 처음으로 돌아와 sequence.count (3 - 2)로 sequence의 배열index[1]인 1과 그 뒤 숫자 1을 sequence.last로 불러온 뒤 first + second를 합친 수를 sequence의 배열에 추가시킵니다.

sequence 배열은 [0, 1, 1, 2] 이 되고 다시 for in 구문의 처음으로 돌아와 sequence.count (4 - 2)로 sequence의 배열index[2]인 1과 그 뒤 숫자 2를 sequence.last로 불러온 뒤 first + second를 합친 수를 sequence의 배열에 추가시킵니다.  

sequence 배열은 [0, 1, 1, 2, 3] 이 되고 다시 for in 구문의 처음으로 돌아와 sequence.count (5 - 2)로 sequence의 배열index[3]인 2와 그 뒤 숫자 3을 sequence.last로 불러온 뒤 first + second를 합친 수를 sequence의 배열에 추가시킵니다.

이런 식으로 반복하다 보면 피보나치 수열이 완성됩니다.

 

func fibRecursionForNumSteps(_ numSteps : Int, _ first : Int, _ second : Int) -> [Int] {
    
    if numSteps == 0 {
        return []
    }
    print(first, second)
    return [first + second] + fibRecursionForNumSteps(numSteps - 1, second, first + second)
}

[0, 1] + fibRecursionForNumSteps(10, 0, 1)
// [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

재귀 함수를 통해 간결한 코드를 구성할 수 있습니다. fibRecursionForNumSteps 함수 뒤에 [0, 1] 배열을 놓음으로써 0일 경우 빈 배열을 반환해 [0, 1]을 출력할 수 있게끔 배치해놓았습니다. 

numSteps이 10일 경우 0이 아니기 때문에 조건문을 건너뛰고 [first(0) + second(1)]이 실행되고 다시 fibRecursionForNumSteps를 실행시키고  배열에 더해줍니다.

numSteps는 - 1 이 됨으로 9가 되고, first는 second 인 1이 되고, second는 first(0) + second(1)인 1이 됩니다. fibRecursionForNumSteps를 다시 9,1, 1에 맞게 돌리면 [ first(1) + second(1)] 2가 되고 다시 fibRecursionForNumSteps 함수를 실행시킵니다.

numSteps는 - 1 이 됨으로 8가 되고, first는 second 인 1이 되고, second는 first(1) + second(1)인 2가 됩니다. 

fibRecursionForNumSteps를 다시 8, 1, 2에 맞게 돌리면 [ first(1) + second(2)] 3가 되고 다시 fibRecursionForNumSteps 함수를 실행시킵니다.

numSteps는 - 1 이 됨으로 7가 되고, first는 second 인 2가 되고, second는 first(1) + second(2)인 3이 됩니다. 

fibRecursionForNumSteps를 다시 7, 2, 3에 맞게 돌리면 [ first(2) + second(3)] 5가 되고 다시 fibRecursionForNumSteps 함수를 실행시킵니다.

numSteps는 - 1 이 됨으로 6가 되고, first는 second 인 3이 되고, second는 first(2) + second(3)인 5가 됩니다. 

이를 계속 반복수행하면 피보나치 수열이 완성됩니다.

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

Time Complexity  (0) 2020.07.06
7. Filter, Map, Reduce Higher Order Functions  (0) 2020.07.04
5. Reverse every other word  (0) 2020.07.03
4. Most Common Name in Array  (0) 2020.07.02
3. Factorials & Recursion  (0) 2020.06.23