user1596433
user1596433

Reputation: 659

No output in Swift Playground

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)

Upvotes: 0

Views: 819

Answers (2)

ABakerSmith
ABakerSmith

Reputation: 22959

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!

Upvotes: 1

Airspeed Velocity
Airspeed Velocity

Reputation: 40973

@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.

Upvotes: 2

Related Questions