Próbuję nauczyć się funkcjonalnego Swifta i zacząłem wykonywać pewne ćwiczenia z Projektu Euler.Suma Fibonacciego używa Funkcjonalnego Swifta
numery Nawet Fibonacciego Problem 2 Każdy nowy termin w ciągu Fibonacciego jest generowany przez dodanie dwóch poprzednich terminów. Rozpoczynając od dnia 1 i 2, pierwsze 10 terminy będą:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
przy wzięciu pod uwagę warunki w sekwencja Fibonacciego, której wartości nie przekraczają czterech milionów, znajdź sumę wartości parzystych.
Wprowadzono memoized funkcji Fibonacciego według WWDC rozszerzone Swift wideo:
func memoize<T:Hashable, U>(body: ((T)->U,T) -> U) -> (T)->U {
var memo = [T:U]()
var result: ((T)->U)!
result = { x in
if let q = memo[x] { return q }
let r = body(result,x)
memo[x] = r
return r
}
return result
}
let fibonacci = memoize { (fibonacci:Int->Double,n:Int) in n < 2 ? Double(n) : fibonacci(n-1) + fibonacci(n-2) }
i realizowane klasy zgodnej z protokołem
class FibonacciSequence: SequenceType {
func generate() -> GeneratorOf<Double> {
var n = 0
return GeneratorOf<Double> { fibonacci(n++) }
}
subscript(n: Int) -> Double {
return fibonacci(n)
}
}
Sequence
Pierwszy (niefunkcjonalnych) rozwiązanie problemu:
var fib = FibonacciSequence().generate()
var n:Double = 0
var sum:Double = 0
while n < Double(4_000_000) {
if n % 2 == 0 {
sum += n
}
n = fib.next()!
}
println(sum)
Drugi, rozwiązanie bardziej funkcjonalne, używając ExSwift za to takeWhile
funkcja
let f = FibonacciSequence()
println((1...40).map { f[$0] }
.filter { $0 % 2 == 0 }
.takeWhile { $0 < 4_000_000 }
.reduce(0, combine: +))
chciałbym poprawić to rozwiązanie, ze względu na zakres 1...40
Pod żebranie, który jest obliczających zbyt wielu kategoriach bez powodu. Idealnie chciałbym mieć jakiś nieskończony zakres, ale jednocześnie obliczać tylko wymagane warunki, które spełniają warunki w jakimkolwiek stanie sugestii?
Przy okazji zauważ, że nie ma potrzeby stosowania typu "Podwójnego". Możesz preferować używanie 'UInt' –
Prawda, jest to pozostałość po tym, gdy próbowałem wyliczyć phi –
OK, edytowane ... może wydawać się bardziej _funkcjonalne_ teraz ;-) –