生兔子问题-看这一篇就够了
来源:互联网 发布:svd分解 对角矩阵 编辑:程序博客网 时间:2024/04/30 04:44
生兔子是一个古老又经典的算法题,题目如下
有1只兔子,第三个月开始每个月会生下1只兔子,生下来的兔子在它的第三个月又会生出一只兔子,以此类推第n个月有多少只 兔子
我们可以简单列一下月份和兔子数
月1234567兔子数11235813当然这种数据还可以继续往后写很多,我们主要找他们的规律
前两个月原始兔子不会生育,没有异议,第三个月开始它生了一只兔子,也就是1+1,有2只兔子,注意红色的兔子下个月不会生育,所以第四个月的兔子总数为1+1+1,有3只兔子,红色的是刚出生的,青色的是上个月出生的,青色兔子在下个月就可以生小兔子了,所以第五个月的兔子总数是1+1+1+2,这里上个月青色的兔子由于可以生育了,我把它变成黑色的1,而上个月红色的,我变成了青色的1标识它下个月可以生兔子了,而这个月刚出生的2只我用红色标识,所以第五个月有5只兔子,那么看第六个月是1+1+1+2+3,上个月青色的由于这个月可以生兔子了所以变成黑色的1了,上个月红色的2这个月变成青色的2说明下个月可以生兔子了,而这个月由于有3个黑色的1在生兔子所以出生3只兔子并且用红色标记,所以第六个月有8只兔子,第七个月以此类推1+1+1+2+3+5,不用解释了是13只兔子
说了这么多,可以总结出一个规则,就是生个月新出生的兔子这个月不会生兔子,而再上一个月的兔子这个月都会生产,如果当前月份是n的话可以得出:
第n个月的兔子总数是,n-2个月兔子总数乘以2加上n-1个月出生的兔子,如果f(n)代表第n个月的兔子总数的话,则有:
第n个月兔子总数 = 第n-2个月兔子总数*2 + 第n-1个月新出生的兔子(新出生的兔子可不是f(n-1),而是f(n-1)减去f(n-2))
f(n) = (f(n-2)) * 2 + (f(n-1) - f(n-2)) =f(n-1) + f(n-2)
这就是最经典的斐波那契数列,也叫费氏数列,那么我们用代码实现下
public class Tuzi {public static int getNum(Integer n){if(n==0){System.out.println("没有第0个月别胡闹");return 0;}//如果是if(n==1||n==2){return 1;}else{return getNum(n-1) + getNum(n-2);}}public static void main(String args[]){System.out.println(getNum(7));}}
以上就是最经典的生兔子算法,采用费氏数列解答
- 生兔子问题-看这一篇就够了
- 有关大数据,看这一篇就够了!
- 关于反爬虫,看这一篇就够了
- 关于反爬虫,看这一篇就够了
- 关于反爬虫,看这一篇就够了
- Android aidl 看这一篇就够了
- Android Gradle 看这一篇就够了
- 关于反爬虫,看这一篇就够了
- 关于Glide 看这一篇就够了
- 关于反爬虫,看这一篇就够了
- 关于深度学习,看这一篇就够了
- 关于反爬虫,看这一篇就够了
- 关于深度学习,看这一篇就够了
- 关于Kaggle入门,看这一篇就够了
- 学习Git,看这一篇文章就够了
- Volley源码看这一篇就够了
- 要认识嵌入式Linux,看这一篇就够了
- 关于Activity,看这一篇就够了
- 如何利用Ultra Librarian software工具生成Allegro封装
- 666_放苹果
- 《算法导论》第二章-第3节_练习(参考答案)
- 安卓性能优化 -- 个人笔记
- React+router+redux兼容ie8下的页面效果
- 生兔子问题-看这一篇就够了
- 一文搞懂LSTM 网络
- Tiling (递推)
- 关闭键盘/收起键盘的方法总结(包括触摸UITableView收起键盘)
- [leetcode]38. Count and Say@Java
- linux驱动模型开发——linux platform总线机制讲解与实例开发
- 安卓性能优化之布局优化(二)
- Linux源码解析-进程-进程
- 17个新手常见Python运行时错误