【发布时间】:2016-11-09 12:37:39
【问题描述】:
我正在为project Euler 问题in this repo 写答案 但在我的解决方案中存在一些性能问题
问题 2: 斐波那契数列中的每个新项都是通过添加前两项来生成的。 从 1 和 2 开始,前 10 个术语将是: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 考虑斐波那契数列中不超过四百万的项,求偶数项之和。
我的解决方案是
func solution2()
{
func fibonacci(number: Int) -> (Int)
{
if number <= 1
{
return number
}
else
{
return fibonacci(number - 1) + fibonacci(number - 2)
}
}
var sum = 0
print("calculating...")
for index in 2..<50
{
print (index)
if (fibonacci(index) % 2 == 0)
{
sum += fibonacci(index)
}
}
print(sum)
}
我的问题是,为什么在第 42 次迭代后它变得超级慢,我想按照问题所说的那样做 4000000 次,有什么帮助吗?
解决方案 2
func solution2_fast()
{
var phiOne : Double = (1.0 + sqrt(5.0)) / 2.0
var phiTwo : Double = (1.0 - sqrt(5.0)) / 2.0
func findFibonacciNumber (nthNumber : Double) -> Int64
{
let nthNumber : Double = (pow(phiOne, nthNumber) - (pow(phiTwo, nthNumber))) / sqrt(5.0)
return Int64(nthNumber)
}
var sum : Int64 = 0
print("calculating...")
for index in 2..<4000000
{
print (index)
let f = findFibonacciNumber(Double(index))
if (f % 2 == 0)
{
sum += f
}
}
print(sum)
}
【问题讨论】:
-
您的代码很慢,而不是 Swift。考虑递归和冗余计算。
-
@DeyaEldeen,您实现它的方式使其呈指数级增长。每个第 N 个数字都在重新计算第 (N-1) 个和第 (N-2) 个数字。并且因此 (N-1)-th 将重新计算 (N-2)-th 和 (N-3) 等。基本上,计算 4 mio 附近的斐波那契的成本也是 4-mio 的函数。
-
好的,我将标题编辑为[为什么我的代码在查找斐波那契和时很慢?]
-
观看 WWDC 2014 视频 Advanced Swift Session 404。有很好的解释(和解决方案)
-
您正在计算前 400 万个斐波那契数的总和。该问题要求所有小于 400 万的斐波那契数的总和。这是非常不同的。不要让问题变得比现在更难。
标签: ios swift xcode macos fibonacci