严格推导的通项公式如下:
$$F(n) = \frac{1}{\sqrt 5} ((\frac{1 + \sqrt 5}{2})^n - (\frac{1 - \sqrt 5}{2})^n)$$
可以看到在实际实现过程中并没有使用到后面那一项,原因如下:
n = 1时后面那一项大约为0.26(算上前面除掉的$\sqrt5$),随着n的增大不断变
小。又因为最终答案为整数,所以后面这一项的作用是与前面的小数部分结合使得最终答案
为整数,n为奇数向上取整,n为偶数向下取整
记第一项为$f_n$,第二项为$\delta _n$,则:
$$F(n) = f_n \pm \delta _n$$
其中$$\delta _n \le 0.26$$
所以$F(n)$为$ f_n$的四舍五入
import math
def fib(n):
fi = (1 + math.sqrt(5)) / 2
return round(math.pow(fi, n) / math.sqrt(5))