Search code examples
swiftrecursionfibonacci

How to print the Fibonacci sequence in Swift Playground using recursion


I am trying to use recursion in Swift to print out the Fibonacci sequence for a number "n" iterations. However, I keep getting the same error.

I have already tried doing it without recursion and was able to do it. However, I am now trying to do in a more complex and "computer scientisty" way by using recursion.

func fibonacciSequence (n: Int) -> [Int]  {

// Consumes a number "n", which is the number of iterations to go through with the Fibonacci formula and prints such sequence.

    var fibonacciArray = [Int]()

    for n in 0 ... n {

        if n == 0 {
            fibonacciArray.append(0)
        }
        else if n == 1 {
            fibonacciArray.append(1)
        }
        else {
            fibonacciArray.append (fibonacciSequence(n: (n - 1)) +
            fibonacciSequence(n: (n-2)))
        }
    }
    return fibonacciArray

I expect to call the function with a number n and for the function to print out the Fibonacci sequence. Example: if n = 5, I expect the console to print 0, 1, 1, 2, 3, 5. The error I get is this: (Cannot convert value of type '[Int]' to expected argument type 'Int').


Solution

  • As pointed out above, the return value is causing an error when summed. A possible way (but not recursive) of fixing the code would be to simply change the else statement:

    func fibonacciSequence (n: Int) -> [Int]  {
    
        // Consumes a number "n", which is the number of iterations to go through with the Fibonacci formula and prints such sequence.
    
        var fibonacciArray = [Int]()
    
        for n in 0 ... n {
    
            if n == 0 {
                fibonacciArray.append(0)
            }
            else if n == 1 {
                fibonacciArray.append(1)
            }
            else {
                fibonacciArray.append (fibonacciArray[n-1] + fibonacciArray[n-2] )
            }
        }
        return fibonacciArray
    }
    
    

    A recursive solution would be the following:

    
    func fibonacciSequence (n: Int, sumOne: Int, sumTwo: Int, counter: Int, start: Bool) {
    
        if start {
            print(0)
            print(1)
        }
        if counter == -1 {
            print(1)
        }
        if (counter == n - 2) {
            return
        }
        let sum = sumOne + sumTwo
        print(sum)
    
        fibonacciSequence(n: n, sumOne: sumTwo , sumTwo: sum, counter: counter + 1, start: false)
    }
    
    fibonacciSequence(n: 8, sumOne: 0, sumTwo: 1, counter: 0, start: true)
    
    

    There is probably a "nicer" way, but I hope it helps. Cheers.