整理一下经典算法用C/C++实现,并思考总结

开拓大脑的算法

题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

常规解法

读题之后,我直接着手进行解题:

思路:设置2个变量分别保存成年兔子数,幼年兔子数量,设置一个计数器分组分别计算每对小兔子还有几个月成年,成年后加入成年兔子。成年兔子每月产下幼年兔子加入幼年兔子。

void rabitNormal(int month){

const int MAX_SHALL_RABIT = 1000;//最大小兔子数量(这个算法用数组做有局限性,最大只能MAX_SMALL_RABIT个兔子)

int big_rabits = 0;//大兔子数量(初始都是小兔子)

int small_r = 1;//小兔子数量

short small_rabits[MAX_SHALL_RABIT];

small_rabits[0]=2;//初始化第一对小兔子计数器

int idx = 1;

for (int i=0; i

for (int j=0; j

if(small_rabits[j]>0){

small_rabits[j]--;

if(small_rabits[j]==0){//第三个月

big_rabits ++;//大兔子增加

small_r--;//小兔子减少

}

}

}

for(int j=0;j

small_rabits[idx++] = 2;//每对大兔子生一对小兔子

small_r++;//小兔子数量增加

}

}

cout<

}

这个方法直接从实现角度来解决这个问题,就事论事,不太优雅。

递归算法

因为每对兔子从出生到生产的过程是一致的,所以我考虑是不是封装一个方法来表示兔子的这一过程,然后用递归实现

//递归实现 返回第一对兔子和之后所有小兔子生下的总兔子对数

int rabits(int month){

int r = 0;

for(int i=2;i<=month;i++){

r+=rabits(month-i);//从第3个月起每个月生一堆兔子

}

return 1 + r;//这只兔子升的小兔子的总对数

}

这个方法我认为从解决问题的角度不失为一个好方法。但对规律问题考虑不深入,也属于就事论事。

斐波那契数列

网上看了正规解法后发现,这道题表现的本质就是斐波那契数列 f(0)=0,f(1)=1...f(n)=f(n-1)+f(n-2) (当前项等于前两项之和)。这一数列强大之处我还无法深入体会,我就整理下如何让兔子生产和斐波那契数列联系起来:

思考过程

1.第一个月1对幼年兔子,0对成年兔子

2.第二个月把幼年兔子加入成年兔子(因为第3个月生产出的幼年兔子等于当月的成年兔子),0对幼年,1对成年

3.第三个月幼年兔子对数 = 前月成年兔子对数1,成年兔对数 = 前月幼兔对数+前月成年对数=0+1=1

总结公式:

兔子总对数 = 成年兔子对数+幼年兔子对数

成年兔子对数 = 前月成年兔子对数+前月幼年兔子对数 = 前月总对数

幼年兔子对数 = 前月成年兔子对数 = 大前月兔子总对数(由上条公式得到)

最终推导公式:兔子总对数 = 前月兔子总对数+大前月兔子总对数! 这个公式正好符合Fibonacci数列

void rabitFibonacci(){

long f1,f2;

int i;

f1=f2=1;

for(i=1;i<=20;i++)

{

printf("%12ld %12ld",f1,f2);

if(i%2==0) printf("\n");/*控制输出,每行四个*/

f1=f1+f2;/*前两个月加起来赋值给第三个月*/

f2=f1+f2;/*前两个月加起来赋值给第三个月*/

}

}

整个推导过程为了让幼年兔子对数更纯净(保证都是上月生产的兔子),次月我们就把前一个月的幼年兔子并入成年了,这是由于从客观上来说

当月成年对数决定次月幼年对数同时和当月幼年对数一起决定当月总对数

当月幼年对数和当月成年对数决定次月成年对数

所以以上对幼年对数当月的“纯净”处理有利于对幼年对数的直接使用(试想一下如果幼年对数中混有新生的和上个月生的,你该如何处理它)。

从这推导过程的构架和实际推导过程中,我认为变量定义功能的明确性和纯净性非常重要。我要的不是这个数列和公式的直接应用,而是这个推导过程。想想当三个月变成四个月,变成五个月该怎么来推导?

小结:3个算法前2个算法是我自己写,第3个方法是参考网上的,推导过程是自己模拟的,虽然花了不少时间做推导,但我觉得还是值得的,因为我现在最缺的就是一颗万事静心思考本质的心,推导的方式固然重要,但这颗探究本质的心更重要

python兔子繁殖问题_【算法】兔子繁殖之斐波那契数列相关推荐

  1. 经典算法(6)斐波拉契数列、兔子繁殖、跳台阶算法

    写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...

  2. python斐波那契数列前20项_兔子繁殖问题带来的智商碾压:斐波那契数列趣谈

    本文来自公众号:超级数学建模 微信号 :supermodeling 原文标题:斐波那契数列趣谈 via 善科 by BB 一般认为斐波那契数列的提出是基于兔子的繁殖问题:如果一开始有一对兔子,它们每月 ...

  3. 循环斐波那契数列_第五课:斐波那契数列(第一课时)

    简介:又称黄金分割数列.因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为"兔子数列",指的是这样一个数列:1.1.2.3.5.8.13.21.34--在数学上,斐波那契数 ...

  4. 算法(1)斐波那契数列

    1.0 问题描述 实现斐波那契数列,求第N项的值 2.0 问题分析 斐波那契数列最简单的方法是使用递归,递归和查表法同时使用,可以降低复杂度. 根据数列特点,同时进行计算的数值其实只有3个,所以可以使 ...

  5. 初学算法——第二天:斐波那契数列

    14天阅读挑战赛 1 定义 斐波那契数列的定义者,是意大利数学家莱昂纳多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍贯是比萨.他被人称作"比萨的 ...

  6. 算法优化:探索斐波那契数列的新航线

    只有用水将心上的雾气淘洗干净,荣光才会照亮最初的梦想. --加西亚·马尔克斯 最近沉迷于算法,总是想着实现与优化,今天想到了斐波那契数列,原来没咋多想,现在回头再看看能不能输出点新花样?! 什么是斐波 ...

  7. 算法学习笔记五 斐波那契数列

    斐波那契数列 一.最基本的 所以,只要知道这个数列的前两项,就可以求出之后所有项了. 核心部分(最简单的递推方法,但是范围是n<=48,否则会超时and溢出): #include <cst ...

  8. Python代码实战(初级篇)————7、斐波那契数列

    题目要求 使用python实现斐波那契数列 题目分析 斐波那契数列有这样的规律: 题目代码实现 方法一: def fib(n):a, b = 1, 1for i in range(n - 1):a, ...

  9. 循环斐波那契数列_剑指offer #10 斐波那契数列

    (递归和循环)#10 斐波那契数列 一.斐波那契数列 定义: n = 0 , f(n) = 0 n = 1 , f(n) = 1 n > 1 , f(n) = f(n-1) + f(n-2) 思 ...

  10. c语言斐波那契数列_视频丨神奇的斐波那契数列科学性与艺术性

    生命是奇妙的 生命是有生命的 斐波那契数列 Fn+1=Fn+Fn-1,这个数列中的每个数字都是前两项数之和,如果是以1,1开头的自然数数列,1,1,2,3,5,8,13,21,34,55,89--这些 ...

最新文章

  1. 任务03——简单程序测试及 GitHub Issues 的使用
  2. 基于JAVA+SpringMVC+Mybatis+MYSQL的学生课堂考勤管理系统
  3. 语言编程思维陈萌_这本书告诉你,计算机为何能读懂人类语言,编程思维让你更聪明...
  4. 基准对象object中的基础类型----元组 (五)
  5. 计算机网络作用范围网络分为,【填空题】从不同作用范围分类,计算机网络可以分为广域网、_______、_________、_________四种...
  6. Python可视化深度图
  7. Oracle alter 语句用法
  8. 学生管理系统(Java实现)
  9. python compare_ssim_Python 之 计算psnr和ssim值
  10. #paypay付款测试#
  11. OpenCV角点检测—Harris,SIFT,ORB(7)
  12. 计算机无法打开浏览器,Internet选项打不开怎么办?IE浏览器internet选项无法打开解决方法...
  13. VirtualBox调试分辨率时遇到的问题
  14. NetSuite 精益实施的ALV实践
  15. C# 添加Word页眉、页脚和页码
  16. VUE H5页面微信/QQ/微博 分享连接设置
  17. 计算机时代的英语阅读,利用微信平台提升英语类专业学生课外阅读能力的实 践意义...
  18. 记录:mac和win共享磁盘(同一局域网)
  19. 十四.ARM裸机学习之iNand详解
  20. windows自带Bitlocker使用问题汇总

热门文章

  1. 包含tsx的react项目创建
  2. dubbo中的group与version的存在意义
  3. linux最新flash+player,Linux版Flash Player正式回归
  4. 桃李的修行小结【转】
  5. 我的小感悟(个人愚见)
  6. 李沐老师 PyTorch版——线性回归 + softmax回归的简洁实现(3)
  7. 西瓜书第三章习题及答案
  8. python中pd是什么意思_python pd
  9. 概率论与数理统计学习笔记——第十八讲——二元随机变量分布函数、边际分布函数及条件分布函数
  10. index函数python查询所有_index函数python查询所有_Python List index()方法