2021-01-04 509.斐波那契数列

509.斐波那契数列

思路一:一个个计算过去

class Solution {
    
    
    public int fib(int n) {
    
    
        if(n<=1)
            return n;
        int a=0;
        int b=1;
        for(int i=0;i<n-1;i++){
    
    
            int tmp = b;
            b = a+b;
            a = tmp;
        }
        return b;
    }
}

思路二:利用递推公式

X n = 1 5 [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] X_n=\frac{1}{\sqrt5}[(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n] Xn=5 1[(21+5 )n(215 )n]

class Solution {
    
    
    public int fib(int n) {
    
    
        return (int) Math.round(1/Math.sqrt(5.0)*(Math.pow((1.0+Math.sqrt(5.0))/2.0,(double) n)-Math.pow((1.0-Math.sqrt(5.0))/2.0,(double) n)));
    }
}

在这里插入图片描述

思路三:对角化矩阵

P = [ 1 1 − 5 − 1 2 5 − 1 2 ] P − 1 = [ ( 5 − 1 ) / ( 2 ∗ 5 ) − 1 / 5 ( 5 + 1 ) / ( 2 ∗ 5 ) 1 / 5 ] P=\begin{bmatrix} 1 & 1\\ \frac{-\sqrt5-1}{2} & \frac{\sqrt5-1}{2} \end{bmatrix} P^{-1}=\begin{bmatrix} (\sqrt5-1)/(2*\sqrt5) & -1/\sqrt5\\ (\sqrt5+1)/(2*\sqrt5) & 1/\sqrt5 \end{bmatrix} P=[125 1125 1]P1=[(5 1)/(25 )(5 +1)/(25 )1/5 1/5 ]
D = [ 1 − 5 2 0 0 1 + 5 2 ] D = \begin{bmatrix} \frac{1-\sqrt5}{2} & 0\\ 0 & \frac{1+\sqrt5}{2} \end{bmatrix} D=[215 0021+5 ]
因为
[ X n + 1 X n ] = P D P − 1 [ X n X n − 1 ] \begin{bmatrix} X_{n+1} \\ X_{n} \end{bmatrix} = PDP^{-1} \begin{bmatrix} X_{n} \\ X_{n-1} \end{bmatrix} [Xn+1Xn]=PDP1[XnXn1]
因此
[ X n X n − 1 ] = P D n − 1 P − 1 [ 1 0 ] \begin{bmatrix} X_{n} \\ X_{n-1} \end{bmatrix} =PD^{n-1}P^{-1} \begin{bmatrix} 1 \\ 0 \end{bmatrix} [XnXn1]=PDn1P1[10]
哈哈,实际上和思路二差不多哈哈哈。

猜你喜欢

转载自blog.csdn.net/weixin_44495738/article/details/112167161