2015-04-20 3 views
0

Я пытаюсь поместить число фибоначчи в массив и хотел бы видеть вывод массива в игровой консоли, но по какой-то причине я не вижу выхода. Может ли кто-нибудь помочь вам понять, что я делаю в своей программе?Нет вывода в Swift Playground

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

@ABakerSmith дал вам хорошее краткое изложение проблем в коде как есть, но вы также можете рассмотреть, вместо того класса, который инициализирует переменную-член массива, написание SequenceType, который возвращает число Фибоначчи:

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) 

Вы можете, конечно, запомнить последовательность, если хотите повысить производительность на нескольких поколениях.

1

У вашей проблемы есть ошибки; если в вашем коде есть ошибки, игровые площадки не будут запускать его, и вы не получите никакого выхода.

  • На линии for counter <= maxNumber; вы получили с запятой, но и, я уверен, что вы не можете объявить for петлю так, если я что-то не хватает? Вы могли бы использовать цикл while.

  • Почему вы пытаетесь вернуть values с вашего init?

  • Вы указали values как константу, но затем пытаетесь ее изменить, используя append.

  • Используя этот код и исправления ошибок, указанных не производит последовательность Фибоначчи, вместо этого он производит: [0, 0, 2, 4, 8, 16, 32, 64, 128]

Попробуйте этот код:

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 
    } 
} 

Затем создать экземпляр:

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

Надеюсь, что это поможет!

+0

Нет необходимости принудительно разворачивать 'last' - опции могут сравниваться с необязательными. –

+0

Улыбаясь, я исправился от ответа. – ABakerSmith

Смежные вопросы