java算法-兔子对数问题

Posted 星仔学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java算法-兔子对数问题相关的知识,希望对你有一定的参考价值。

package com.zhangxing.arthmetic;

/**
 * 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,
 * 小兔子长到第三个月后每个月又生一对兔子,
 * 假如兔子都不死,问每个月的兔子总数为多少?
 * 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....  
 * @author zhangxing
 * 
 */
public class FirstRabbit 
	
	/**
	 * 
	 * @param month , pair
	 * @return pairOfRabbits
	 */
	public long getPairOfRabbits(long month , long pair)
		
		//参数校验
		boolean checkMonthResult = checkMonth(month);
		boolean checkMonthPair = checkPair(pair);
		//定义初始变量兔子总对数
		//int pairOfRabbits = 0;
		//考虑到数值会非常大,所以该处改为long
		long pairOfRabbits = 0;
		//1.先判断校验是否通过
		if(checkMonthResult && checkMonthPair)
			if(month <= 2)
				pairOfRabbits = 1;
			else
				//因为一直访问的是该函数本身,所以用了递归算法,公式:第三个月的为前两个之和
				pairOfRabbits = getPairOfRabbits(month-1 ,1) + getPairOfRabbits(month-2 ,1);
			
		
		return pair * pairOfRabbits;
	

	//对传入的初始兔子对数进行校验
	private  boolean checkPair(long pair) 
		if(pair < 0)
			//目前是打印在console,正常情况下放在日志下,logger.log();
			System.out.println("【输入的兔子对数不合法!】");
			return false;
		
		return true;
	
	
	//对传入的月份进行校验
	private  boolean checkMonth(long month) 
		if(month < 0)
			//目前是打印在console,正常情况下放在日志下,logger.log();
			System.out.println("【输入的月份不合法!】");
			return false;
		
		return true;
	


最近对算法产生了很浓的兴趣,网上找了找经典的算法题。

但是经过简单的测试后发现问题,效率太慢。原因在于递归算法本身对该方法访问的次数太多。

针对这个问题,去网上找了一下源码。

   long f1 = 1L, f2 = 1L;
			   long f;
			   for(int i=3; i<50; i++) 
			    f = f2;
			    f2 = f1 + f2;
			    f1 = f;
			    System.out.print("第" + i +"个月的兔子对数: ");
			    System.out.println(" " + f2);
			  
发现源码的速度非常快,当时就对此非常诧异,研究后发现了以前学习数据结构时候讲到的复杂度问题,目前正在研究中,也请大家不吝赐教~

以上是关于java算法-兔子对数问题的主要内容,如果未能解决你的问题,请参考以下文章

需掌握 - JAVA算法编程题50题及答案

算法题目--知识盲区记录一下

C#语言设计 兔子繁殖问题。

Python趣味算法学习笔记------兔子产子(不死神兔)

经典算法40例:1

兔子问题or斐波那契数列