JAVA经典兔子问题

有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子,假如兔子都不死,问M个月时兔子的数量。

很经典的斐波那契数列问题。 记得第一次看到这道题是在一次比赛中,当时并不知道斐波那契数列,但是列出来几个月的兔子数后看到了这个规律,按照这个规律写出来的代码没有通过测试。

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(≥ 2,∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。

很长一段时间没有看过这道题了,这次偶然做到这道题,我们试试不用递归不用斐波那契数列,从另一个角度来解决这个问题。

nq3为本月可以生兔子的,有老兔子和在本月才到3月的兔子,此兔子不会清零,只会一直增加。

nq2为本月到2月的兔子,由于有兔子去了3月,需清零,再加上刚到2月的兔子。

nq1为本月刚出生的兔子,同nq2,有兔子去了2月,清零,再加上nq3生的兔子。

由于兔子不会死亡,本月刚出生兔子 + 2月兔子 + 可以生兔子的兔子 = 本月兔子总数 (按对计算)

(PS:这么思考逻辑是对的,但是我有点不理解,小兔子长到第三个月后,按我的理解应该是,假如从四月出生的兔子,4 -> 5 -> 6 -> 7,(四月初1个月到五月初,五月初1个月到六月初,六月初1个月到七月初)应该是在七月初这个兔子才可以生新兔子。

这个题目里长到第三个月后,4 -> 5 -> 6 是这样理解的吗?如果我理解的有问题,敬请指正。)

public class Rabbit{
	public static void main(String[] args){
        //兔子问题
       
		for(int month = 1; month < 21; month++){
			int nq3 = 1;
			int nq2 = 0;
			int nq1 = 0;
			int sum = nq3 + nq2 + nq1;

			for(int i = 3; i <= month; i++){
				nq3 += nq2;
				nq2 = 0;
				nq2 += nq1;
				nq1 = 0;
				nq1 += nq3;
				sum = nq3 + nq2 + nq1;
			}
			System.out.println(month + "月:" + sum);
		}
	}
}

你可能感兴趣的:(java,intellij-idea)