快速斐波那契
这种方法基于如下的公式:
F
(
2
k
)
=
F
(
k
)
[
2
F
(
k
+
1
)
−
F
(
k
)
]
F
(
2
k
+
1
)
=
F
(
k
+
1
)
2
+
F
(
k
)
2
F(2k) = F(k) \left[ 2F(k+1) - F(k) \right] \\ F(2k+1) = F(k+1)^2 + F(k)^2
F(2k)=F(k)[2F(k+1)−F(k)]F(2k+1)=F(k+1)2+F(k)2
这种的计算方法的时间复杂度是
Θ
(
log
n
)
\Theta(\log n)
Θ(logn)
python代码
# returns F(n)
def fibonacci(n: int): # noqa: E999 This syntax is Python 3 only
if n < 0:
raise ValueError("Negative arguments are not supported")
return _fib(n)[0]
# returns (F(n), F(n-1))
def _fib(n: int): # noqa: E999 This syntax is Python 3 only
if n == 0:
# (F(0), F(1))
return (0, 1)
else:
# F(2n) = F(n)[2F(n+1) − F(n)]
# F(2n+1) = F(n+1)^2+F(n)^2
a, b = _fib(n // 2)
c = a * (b * 2 - a)
d = a * a + b * b
if n % 2 == 0:
return (c, d)
else:
return (d, c + d)
关于这种计算方法的详细介绍见fast-fibonacci-algorithms