TX面试题:
已知有一头牛4年后开始生小牛,一次只能生一只,问20年后一共有多少头牛?

这种问题就是简单的递归:
这头奶牛在第四年后能不断生子直到第二十年,其子出生4年后又能不断生子……

代码如下:

#include <iostream>
using namespace std;int func(int n)//计算当前这头牛在n年中能创造多少后代(包括后代的后代)
{int sum = 0;if (n <= 3)return sum;for (int i = 4; i <= n; i++){sum++; //当前这头牛在第i年生的小牛sum += func(n - i + 1);//当前这头第i年出生的小牛接下来要产生的后代}return sum;
}int main()
{int s;s = func(20);cout << s + 1 << endl;system("pause");return 0;
}

法2:
其实递推公式就是斐波那契数列f(n)=f(n-1)+f(n-3);

int f(int n)
{if (n == 1)return 1;if (n == 2)return 1;if (n == 3)return 1;if (n == 4)return 2;return f(n - 1) + f(n - 3);
}int main()
{cout << f(20)<< endl;system("pause");return 0;
}

法3:
利用快速幂乘矩阵算法求解斐波那契数列。

当n很大时,用递归求解斐波那契数列效率是非常低的,所以要用快速幂乘矩阵算法求解斐波那契数列。将O(n)的时间复杂度,降到O(logn)。

class Cows {public:void Multiply(long a[3][3], long b[3][3])//矩阵相乘a=a*b{long temp[3][3] = { 0 };for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){for (int k = 0; k < 3; k++){temp[i][j] += a[i][k] * b[k][j] % 1000000007;temp[i][j] %= 1000000007;}}}for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++)a[i][j] = temp[i][j];}}//第1年:1//第2年:2//第3年:3//第4年:4//第5年:6//f(n)=f(n-1)+f(n-3)int countSum(int n) {if (n <= 4)return n;long res[3][3] = { 1,0,0,0,1,0,0,0,1 };//单位阵long base[3][3] = { 1,0,1,1,0,0,0,1,0 };//要求base矩阵的n-3次方int num = n - 3;while (num){if (num % 2){Multiply(res, base);}Multiply(base, base); //(base^2) ^ (n/2) ...(base^4) ^ (n/4)...(base^n) ^ (1)num /= 2;}return (res[0][0] * 3 + res[0][1] * 2 + res[0][2] * 1) % 1000000007;}
};

奶牛家族(斐波那契数列的快速幂乘矩阵算法)相关推荐

  1. 斐波拉契数列的递推递归求解算法

    介绍: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...

  2. 浅谈斐波那契数列——从递推到矩阵乘法

    说在前面 相信大家都已经知道这个中外著名的费波纳切数列了吧,关于费波那契数列有很多有趣的性质,但我们这里不讲,在这里我们只是利用斐波那契数列来引出另一个神奇的东西,矩阵乘法,递推在这里是起一个对比与铺 ...

  3. 快速幂求解斐波那契数列

    斐波那契数列 斐波那契数列是很经典也很简单的一条题目.其满足: F n = { 1 ( n ≤ 2 ) F n − 1 + F n − 2 ( n ≥ 3 ) F_{n}= \begin{cases} ...

  4. 数据结构与算法--再谈递归与循环(斐波那契数列)

    再谈递归与循环 在某些算法中,可能需要重复计算相同的问题,通常我们可以选择用递归或者循环两种方法.递归是一个函数内部的调用这个函数自身.循环则是通过设置计算的初始值以及终止条件,在一个范围内重复运算. ...

  5. 牛客18987 粉嘤花之恋(矩阵快速幂、斐波那契数列)

    链接:https://ac.nowcoder.com/acm/problem/18987 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  6. luogu P1962 斐波那契数列

    (gg直接讲的用矩阵求斐波那契数列 (原地死亡 (全程一脸懵逼 (然后看了半个点题解 首先,什么是矩阵呢 就是类似于这样的东西(里面可以填什么复数啊,实数啊的 然后矩阵的基本运算了解一下 加法很简单e ...

  7. CQUOJ月赛(5月)H题:zzblack与斐波那契数列

    H. zzblack与斐波那契数列 Case Time Limit: 3000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      ...

  8. Python数学计算工具3、Python 斐波那契数列-前500项列表

    百度解析: 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...

  9. c语言斐波那契数列_从数学角度浅谈斐波那契数列

    斐波那契数列历史由来已久,关于这个算法的方式也有很多,这篇讲一个由最复杂到最简单的转化. 该文主要从数学角度出发粗略谈谈. Fibonacci数列递推式为: 下面从数学角度思考这个问题,你应该还记得, ...

最新文章

  1. Android中的context
  2. 禄露禄露碌脛脥炉脛锚,学者批时下宫廷戏“就是一堆文化垃圾”
  3. 通过js让页面中的元素上下居中的写法
  4. 神经网络Drop大法真香定律
  5. 云效Codeup代码评审中的代码协同
  6. base64是哪个jar包的_涨知识 | 用maven轻松管理jar包
  7. java spark dataset_Spark 2.0介绍:Dataset介绍和使用
  8. 服务器虚拟化的主备,云服务器可以主备切换
  9. shell 数据类型
  10. 神经网络用作分类器(附代码matlab)
  11. ubuntu18 安装caj阅读器 wine
  12. 【mmdetection】测试单张图像
  13. tableau之仪表板与故事
  14. 学校的计算机是作文,未来的电脑学校作文
  15. java swing(GUI) MySQL实现的学生选课签到考勤系统源码开发教程
  16. android官方自带下拉刷新功能
  17. 信息竞赛:DEV C++常用技巧
  18. KOL营销之痛点难点
  19. css中字体大小font-size的设置
  20. 20、JAVA进阶——集合(1)

热门文章

  1. DAPLink简单移植
  2. 解决:你的博文 XXXX 因涉及“版权不明”, 审核未通过,您可以修改相关内容后再次发布。
  3. 电脑接两个屏幕,其中一个偶尔闪灭
  4. 为什么win10默认浏览器更改不了已解决
  5. 计算机图形学对勾函数,高一数学 : 最全函数图像汇总,不看准后悔!
  6. stm32最小系统USB转TTL接线
  7. 河南科技学院对口计算机分数线,河南科技学院09对口升学分数线
  8. 江城子·密州出猎 【宋代】苏轼
  9. 计算机知识培训感言,关于计算机培训心得体会
  10. Web项目实现前端锁屏功能