Tôi đang cố gắng tìm hiểu hàm Swift và bắt đầu thực hiện một số bài tập từ Project Euler.Tổng số từ Fibonacci dùng hàm Swift
Ngay cả các số Fibonacci Bài toán 2 Mỗi thuật ngữ mới trong chuỗi Fibonacci được tạo bằng cách thêm hai cụm từ trước đó. Bằng cách bắt đầu với 1 và 2, 10 từ đầu tiên sẽ là:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Bằng cách xem xét các điều khoản trong chuỗi Fibonacci có giá trị không vượt quá bốn triệu, tìm tổng các thuật ngữ có giá trị.
thực hiện một chức năng Fibonacci memoized, theo WWDC tiến video Swift:
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) }
và thực hiện một lớp phù hợp với Sequence
giao thức
class FibonacciSequence: SequenceType {
func generate() -> GeneratorOf<Double> {
var n = 0
return GeneratorOf<Double> { fibonacci(n++) }
}
subscript(n: Int) -> Double {
return fibonacci(n)
}
}
đầu tiên (không có chức năng) giải pháp của vấn đề:
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)
Thứ hai, giải pháp thêm chức năng, sử dụng ExSwift cho nó takeWhile
chức năng
let f = FibonacciSequence()
println((1...40).map { f[$0] }
.filter { $0 % 2 == 0 }
.takeWhile { $0 < 4_000_000 }
.reduce(0, combine: +))
Tôi muốn cải thiện về giải pháp này, vì 1...40
loạt tại cầu xin đó là tính toán quá nhiều điều khoản không có lý do. Lý tưởng nhất là tôi muốn để có thể có một số loại phạm vi vô hạn, nhưng cùng lúc đó chỉ tính toán các điều khoản cần thiết đáp ứng các điều kiện trong takeWhile
Bất kỳ lời đề nghị?
Nhân tiện, hãy lưu ý rằng loại 'Double' không cần thiết. Bạn có thể thích sử dụng 'UInt' –
Đúng, đó là phần còn lại từ khi tôi thử tính toán phi –
Ok, đã chỉnh sửa ... có vẻ như có thêm _functional_ now ;-) –