递归之母牛

来源:互联网 发布:python可以用来做什么 编辑:程序博客网 时间:2024/06/01 08:03
package com.lyk.kk;/** * Created by Administrator on 2017/9/6. * 假设农场中有成熟的母牛每年只会生1头小母牛,并且永不会死。第一年农场有1只成熟的母牛, * 从第二年开始,母牛开始生小母牛,每只小母牛三年之后成熟又可以生小母牛,给定正数N, * 求出N年后的牛的数量。。 * 所有的牛都不会死,所以第n-1年的牛会毫无损失地活到第n年。同时。所有成熟的牛都会生1头新的牛, * 那么成熟的牛的数量就是第n-3年的所有牛,到第n年的肯定都是成熟的牛。其间出生的牛肯定都没有成熟。 * 所以C(N)=C(N-1)+C(N-3). * 初始项 C(1)==1  C(2)==2  C(3)==3 * 与斐波那契特别类似。 */public class A3 {    //暴力递归    public int c1(int n){        if(n<0) return 0;        if(n==1||n==2||n==3) return n;        return c1(n-1)+c1(n-3);    }    //olog(n)    //C(N)=C(N-1)+C(N-3).是一个三姐递推数列,一定可以用矩阵乘法的形式表示。且状态矩阵为3*3矩阵    public int c3(int n){        if(n<0) return 0;        if(n==1||n==2||n==3) return n;        int [][] base={{1,1,0},{0,0,1},{1,0,0}};        int [][]result=matrixPower(base,n-2);        return 3*result[0][0]+2*result[1][0]+result[2][1];    }//矩阵相乘    public int[][] muliMatrix(int [][]m1,int [][]m2){        int [][]result=new int[m1.length][m2[0].length];        for(int i=0;i<m1.length;i++){            for(int j=0;j<m2[0].length;j++){                for(int k=0;k<m2.length;k++){                    result[i][j]+=m1[i][k]*m2[k][j];                }            }        }        return result;    }    //矩阵的n次幂    public int[][] matrixPower(int [][]m,int p){        int [][]result=new int[m.length][m[0].length];        for(int i=0;i<result.length;i++){            result[i][i]=1;        }        int [][]temp=m;        for(;p!=0;p>>=1){            if((p&1)!=0){                result=muliMatrix(result,temp);            }            temp=muliMatrix(temp,temp);        }        return result;    }}
原创粉丝点击