0

I am trying to put fibonacci number in an array and wanted to see the array output in playground console but for some reason I do not see any ouput. Can someone plz help in making me understand the mistake that I am cdoing in my program ?

import UIKit

class FibonacciSequence {

    let includesZero: Bool
    let values: [Int]

    init(maxNumber: Int, includesZero: Bool) {
        self.includesZero = includesZero
        values = [0]
        var counter: Int
        if (includesZero == true) { counter = 0 }
        else { counter = 1 }
        for counter  <= maxNumber; {
            if ( counter == 0 ) {
                values.append(0)
                counter = 1
            }
            else {
                counter = counter + counter
                values.append(counter)
            }
        }
        println(values)

    }

    println(values)
    return values
}

let fibanocciSequence = FibonacciSequence(maxNumber:123, includesZero: true)

2 Answers 2

2

@ABakerSmith has given you a good rundown of the problems in the code as-is, but you also might want to consider, instead of a class that initializes an array member variable, writing a SequenceType that returns fibonacci numbers:

struct FibonacciSequence: SequenceType {
    let maxNumber: Int
    let includesZero: Bool

    func generate() -> GeneratorOf<Int> {
        var (i, j) = includesZero ? (0,1) : (1,1)
        return GeneratorOf {
            (i, j) = (j, i+j)
            return (i < self.maxNumber) ? i : nil
        }
    }
}

let seq = FibonacciSequence(maxNumber: 20, includesZero: false)

// no arrays were harmed in the generation of this for loop
for num in seq {
    println(num)
}

// if you want it in array form:
let array = Array(seq)

You could of course memoize the sequence if you want to improve performance on multiple generations.

Sign up to request clarification or add additional context in comments.

Comments

1

Your problem is your code has errors in it; if there are errors in your code Playgrounds won't run it and you won't get any output.

  • On the line for counter <= maxNumber; you've got a semi-colon, but also, I'm pretty sure you can't declare a for loop like that, unless I'm missing something? You could use a while loop though.

  • Why are you trying to return values from your init method?

  • You've declared values as a constant but are then trying to change it using append.

  • Using this code and fixing the errors stated does not produce the Fibonacci sequence, instead it produces: [0, 0, 2, 4, 8, 16, 32, 64, 128]

Try this code:

class FibonacciSequence {
    let values: [Int]

    init(maxNumber: Int, includesZero: Bool) {
        var tempValues = includesZero ? [0] : [1]
        var current = 1

        do {
            tempValues.append(current)

            let nMinus2 = tempValues[tempValues.count - 2]
            let nMinus1 = tempValues[tempValues.count - 1]

            current = nMinus2 + nMinus1

        } while current <= maxNumber

        self.values = tempValues
    }
}

Then create an instance:

let fibanocciSequence = FibonacciSequence(maxNumber:123, includesZero: true)
println(fibanocciSequence.values) // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Hope that helps!

2 Comments

No need to force-unwrap last – optionals can be compared to non-optionals.
Cheers, I've amended by answer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.