2021-02-04:第一年农场有1只成熟的母牛A,往后的每年:①每一只成熟的母牛都会生一只母牛 ②每一只新出生的母牛都在出生的

举报
福大大架构师每日一题 发表于 2021/02/04 21:45:50 2021/02/04
【摘要】 2021-02-04:第一年农场有1只成熟的母牛A,往后的每年:①每一只成熟的母牛都会生一只母牛 ②每一只新出生的母牛都在出生的第三年成熟  ③每一只母牛永远不会死 。请问N年后牛的数量是多少 ?福哥答案2021-02-04:举例:N=6,第1年1头成熟母牛记为a; 第2年a生了新的小母牛,记为b,总牛数为2; 第3年a生了新的小母牛,记为c,总数为3; 第4年a生了新牛d,总数4; 第5年...

2021-02-04:第一年农场有1只成熟的母牛A,往后的每年:①每一只成熟的母牛都会生一只母牛 ②每一只新出生的母牛都在出生的第三年成熟  ③每一只母牛永远不会死 。请问N年后牛的数量是多少 ?
福哥答案2021-02-04:

举例:
N=6,第1年1头成熟母牛记为a; 
第2年a生了新的小母牛,记为b,总牛数为2; 
第3年a生了新的小母牛,记为c,总数为3; 
第4年a生了新牛d,总数4; 
第5年b成熟了,ab分别生了一只,总数为6; 
第6年c也成熟了,abc分别生了一只,总数为9,故返回9.

递推式是f(n)=f(n-1)+f(n-3)。

如果某个递归,除了初始项之外,具有如下的形式:
F(N) = C1 * F(N) + C2 * F(N-1) + … + Ck * F(N-k) ( C1…Ck 和k都是常数)。
并且这个递归的表达式是严格的、不随条件转移的。那么都存在类似斐波那契数列的优化,时间复杂度都能优化成O(logN)。

代码用golang编写,代码如下:

```go
package main

import "fmt"

func main() {
    fmt.Println(c3(6))
}
func c3(n int) int {
    if n < 1 {
        return 0
    }
    if n == 1 || n == 2 || n == 3 {
        return n
    }
    base := [][]int{
        {1, 1, 0},
        {0, 0, 1},
        {1, 0, 0}}
    res := matrixPower(base, n-3)
    return 3*res[0][0] + 2*res[1][0] + res[2][0]
}

//矩阵的p次方
func matrixPower(m [][]int, p int) [][]int {
    mLen := len(m)
    m0Len := len(m[0])
    res := make([][]int, mLen)
    for i := 0; i < mLen; i++ {
        res[i] = make([]int, m0Len)
    }

    for i := 0; i < mLen; i++ {
        res[i][i] = 1
    }

    tmp := m
    for ; p != 0; p >>= 1 {
        if p&1 != 0 {
            res = muliMatrix(res, tmp)
        }
        tmp = muliMatrix(tmp, tmp)
    }
    return res
}

//两个矩阵相乘
func muliMatrix(m1 [][]int, m2 [][]int) [][]int {
    m1Len := len(m1)
    m20Len := len(m2[0])
    m2Len := len(m2)
    res := make([][]int, m1Len)
    for i := 0; i < m1Len; i++ {
        res[i] = make([]int, m20Len)
    }

    for i := 0; i < m1Len; i++ {
        for j := 0; j < m20Len; j++ {
            for k := 0; k < m2Len; k++ {
                res[i][j] += m1[i][k] * m2[k][j]
            }
        }
    }

    return res
}
```
执行结果如下:

***
[答案参考左神的java代码](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class26/Code02_FibonacciProblem.java)
[评论](https://user.qzone.qq.com/3182319461/blog/1612393428)

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。