package wulj;

 /**
* Java算法之“兔子问题”:
* 有一只兔子,从出生后第3个月起每个月都生只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
* @Description
* @author wulj
* @date 2018年6月1日
*/
public class WljTest {
/**
* 转化为数学问题如下:
* 1.假设第一个月的兔子数为:a,第二个月的兔子数为:b
* 2.假设第一个月的新兔子数为 :new,老兔子数为:old 即:a=new + old;,则 第二个月b= new + 2*old;
* 到了第三个月的时候,则第二个月的 new存储的已经是老兔子,新兔子实际是old产生的,所以第三个月的秃子数量为:c= 2*(new + old) + old
* 3.化简后发现 a=new + old
* b= new + 2*old
* c= 2*new + 3*old
* 即:c= a + b;
* 因此转换为代码实现如函数:rabbitProblem()
*/
public static void rabbitProblem(){
int sum_rubbit;//每月的兔子总数
int pre_pre_rubbit = 1;//前两个月的兔子数
int pre_rubbit = 1;//前一个月的兔子数
for (int i = 3; i <= 12; i++) {
sum_rubbit = pre_pre_rubbit + pre_rubbit;
pre_pre_rubbit = pre_rubbit;
pre_rubbit = sum_rubbit;
System.out.println("第" + i + "个月的兔子总是为:" + sum_rubbit);
}
}
public static int rabbitProblem_digui(int month){
int sum=0;
if(month == 1 || month == 2){
return 1;
}else{
sum = rabbitProblem_digui(month-1)+rabbitProblem_digui(month-2);
return sum;
} } /**
* 另外一种思路--转化为数学问题如下:
* 1.假设第一个月的兔子数为:a,第二个月的兔子数为:b
* 2.假设第一个月的新兔子数为 :new,老兔子数为:old 即:a=new + old;,则 第二个月b= new + 2*old;
* 到了第三个月的时候,则第二个月的 new存储的已经是老兔子,新兔子实际是old产生的,所以第三个月的秃子数量为:c= 2*(new + old) + old
* 通过上面的规律我们发现:
* 当月的new的数量和上个月的old数量是相等的,当月的old的数量是上个月的new与上个月的old的数量之和,当月的总数量是当月的new和当月的old的数量之和
* 因此转换为代码实现如函数:rabbitProblem_new()
*/
public static void rabbitProblem_new(){
int sum_rubbit = 0;//每月的兔子总数
int new_rubbit = 1;//前两个月的兔子数
int old_rubbit = 0;//前一个月的兔子数
int temp_new = 0;
//第一个月:
for (int i = 1; i <= 12; i++) {
sum_rubbit = new_rubbit + old_rubbit;
temp_new = old_rubbit;
old_rubbit = old_rubbit + new_rubbit;
new_rubbit = temp_new;
System.out.println("第" + i + "个月的兔子总是为:" + sum_rubbit);
}
} /**
* 递归方法
* @param i
* @param new_rubbit
* @param old_rubbit
*/
public static void rabbitProblem_new_digui(int i, int new_rubbit,int old_rubbit){
int sum_rubbit = 0;//每月的兔子总数
int temp_new = 0;
sum_rubbit = new_rubbit + old_rubbit;
if(i == 12){
System.out.println("第" + i + "个月的兔子总是为:" + sum_rubbit);
return;
}else{
temp_new = old_rubbit;
old_rubbit = old_rubbit + new_rubbit;
new_rubbit = temp_new;
rabbitProblem_new_digui(i+1,new_rubbit,old_rubbit);
}
System.out.println("第" + i + "个月的兔子总是为:" + sum_rubbit); }
public static void main(String[] args) {
rabbitProblem_new_digui(1,1,0);
}
}

Java算法之“兔子问题”的更多相关文章

  1. JAVA算法系列 冒泡排序

    java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...

  2. JAVA算法系列 快速排序

    java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...

  3. java算法 蓝桥杯 乘法运算

    问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...

  4. java算法 蓝桥杯 扶老奶奶街

    一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...

  5. java算法 蓝桥杯 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

  6. java算法 蓝桥杯 格子位置

    问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...

  7. java算法----排序----(6)希尔排序(最小增量排序)

    package log; public class Test4 { /** * java算法---希尔排序(最小增量排序) * * @param args */ public static void ...

  8. java算法----排序----(5)归并排序

    package log; import java.util.Arrays; public class Test4 { /** * java算法---归并排序 * * @param args */ pu ...

  9. java算法----排序----(4)快速排序

    package log; public class Test4 { /** * java算法---快速排序 * * @param args */ public static void main(Str ...

随机推荐

  1. Atitit JAVA p2p设计与总结  JXTA 2

    Atitit JAVA p2p设计与总结  JXTA 2 JXTA 2 是开放源代码 P2P 网络的第二个主要版本,它利用流行的.基于 Java 的参考实现作为构建基础.在设计方面进行了重要的修改,以 ...

  2. Atitit.检测文本文件的编码 自动获取文件的中文编码

    Atitit.检测文本文件的编码 自动获取文件的中文编码 1 不能使用load来检测编码..1 2 使用convert来检测编码1 3 程序检测文本编码2 3.1 根据utf bom头2 3.2 检测 ...

  3. makefile之强制目标

    强制目标 1. 定义 如果一个规则(rule_A)既没有依赖也没有命令,仅有目标(Targe_A),并且目标名不冲突.那么,在执行这个规则的时候,目标总被认为是更新过的.如果这个目标(Target_A ...

  4. 文件IO之——阻塞和非阻塞及perror函数

    读常规文件是不会阻塞的,不管读多少字节,read一定会在有限的时间内返回.从终端设备或网络读则不一定,如果从终端输入的数据没有换行符,调用read读终端设备就会阻塞,如果网络上没有接收到数据包,调用r ...

  5. mvn命令若干:

    mvn命令若干: mvn -h,不会用时,可寻求帮助. mvn clean compile,将.java类编译为.class文件: mvn clean test, 执行单元测试.本质上,还是执行了一个 ...

  6. pl/sql 实例精解 06

    1. 简单循环 1: LOOP 2: statement1; 3: statement2; 4: EXIT WHEN condition; 5: END LOOP; 6: statement3; 也可 ...

  7. 用Eclipse的tomcat插件启动tomcat时报错:

    用Eclipse的tomcat插件启动tomcat时报错: FATAL ERROR in native method: JDWP No transports initialized, jvmtiErr ...

  8. VIM配置入门

    原文链接: http://www.ruanyifeng.com/blog/2018/09/vimrc.html 个人增加了两张收集来的图.

  9. 第一百三十六节,JavaScript,封装库--事件绑定

    JavaScript,封装库--事件绑定 在函数库添加两个函数 添加事件绑定函数 删除事件绑定函数 添加事件绑定函数 /** addEvent()函数库函数,跨浏览器添加事件绑定,注意:传入事件名称时 ...

  10. 推荐linux命令在线查,简约而不简单

    1.相关介绍: 网址:http://blog.51yip.com/linux/1518.html#more-1518 2.Linux 命令在线sce 网址:http://linux.51yip.com ...