• 斐波那契问题(java)


    F(n)=F(n-1)+F(n-2)

    1.迭代实现,O(2的N次方)

     1 /**
     2      * 斐波那契 迭代实现
     3      * @param n
     4      * @return
     5      */
     6     public int Fabonacci_1(int n){
     7         if(n<0)return 0;
     8         if(n==1||n==2) return 1;
     9         return Fabonacci_1(n-1)+Fabonacci_1(n-2);
    10     }

    2.递归实现,O(N)

     1 /**
     2      * 斐波那契 递归实现
     3      * @param n
     4      * @return
     5      */
     6     public int Fabonacci_2(int n){
     7         if(n<0)return 0;
     8         if(n==1||n==2) return 1;
     9         int res = 1,pre=1,temp=0;
    10         for(int i=3;i<=n;i++){
    11             temp = res;
    12             res = res+pre;
    13             pre = temp;
    14         }
    15         return res;
    16     }

    3.使用二阶矩阵实现,O(logN)

     1 /**
     2      * 斐波那契 二阶矩阵实现
     3      * @param n
     4      * @return
     5      */
     6     public int Fabonacci_3(int n){
     7         if(n<0)return 0;
     8         if(n==1||n==2) return 1;
     9         int[][] base={{1,1},{1,0}};
    10         int[][] res = matrixPower(base, n-2);
    11         return res[0][0]+res[1][0];
    12     }
    13     
    14     //使用二阶矩阵求 斐波那契
    15     
    16     public int[][] matrixPower(int[][] m,int p){
    17         int[][] res = new int[m.length][m[0].length];
    18         //设置res为单位矩阵
    19         for(int i=0;i<res.length;i++){
    20             res[i][i]=1;
    21         }
    22         
    23         int[][] temp = m;
    24         for(;p!=0;p>>=1){
    25             if((p&1)!=0){
    26                 muliMatrix(res, temp);
    27             }
    28             muliMatrix(temp, temp);
    29             
    30         }
    31         return res;
    32     }
    33     
    34     
    35     //2个矩阵相乘
    36     public int[][] muliMatrix(int[][] m1,int[][] m2){
    37         int[][] res = new int[m1.length][m2[0].length];
    38         for(int i=0;i<m1.length;i++){
    39             for(int j=0;j<m2[0].length;j++){
    40                 for(int k=0;k<m2.length;k++){
    41                     res[i][j] += m1[i][k]*m2[k][j];
    42                 }
    43             }
    44         }
    45         return res;
    46     }
  • 相关阅读:
    栈和队列的概念
    01-开始使用django(全、简)
    临时记录01
    centos删除乱码名称的文件
    《计算机网络》谢希仁(第7版) 第一章
    git提交到远程虚拟机
    安全篇:弱密码python检测工具
    正向代理、Nginx(反向代理、负载均衡、静态资源服务器)
    列表去重、去除满足一定条件的元素
    editplus的常用快捷键
  • 原文地址:https://www.cnblogs.com/b-dong/p/6417075.html
Copyright © 2020-2023  润新知