`

费式数列问题

 
阅读更多

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

 

程序中的bearAge为3时,即为题目中的3个月,也可以为任意大于等于2个月后生。

 

package algorithm.fibonacci;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class RabbitService {

	class Rabbit {

		public int age;

		public Rabbit() {
			this.age = 1;
		}

		public Rabbit(int age) {
			this.age = age;
		}
	}

	/*
	 * 面向对象方法
	 */
	public void printRabbit(int month, int bearAge) {

		if (month > 0) {
			long start = System.currentTimeMillis();
			// 保存每个月份的兔子数目
			long[] rabbitNumbersArray = new long[month];

			// rabbitList保存所有的兔子,在第一个月有一对大兔子
			Rabbit bigRabbit = new Rabbit();
			List<Rabbit> rabbitList = new ArrayList<Rabbit>();
			rabbitList.add(bigRabbit);

			rabbitNumbersArray[0] = rabbitList.size();

			// 从第二个月开始计算,如果兔子刚生下来age为1,则age为3时兔子才能生兔子
			for (int currentMonth = 2; currentMonth <= month; currentMonth++) {
				int lastMonthRabbitNumber = rabbitList.size();
				for (int i = 0; i < lastMonthRabbitNumber; i++) {
					Rabbit rabbit = rabbitList.get(i);
					rabbit.age++;
					if (rabbit.age >= bearAge) {
						rabbitList.add(new Rabbit());
					}
				}
				rabbitNumbersArray[currentMonth - 1] = rabbitList.size();
			}
			long end = System.currentTimeMillis();
			System.out.println("1月到" + month + "月的兔子数目为:"
					+ Arrays.toString(rabbitNumbersArray) + ",使用时间为"
					+ (end - start));
		} else {
			System.out.println("输入月份必须大于0");
		}
	}

	/*
	 * 作用递归方法计算费式数列,当兔子生育月不为3时,也可以计算
	 */
	public void printRabbit2(int month, int bearAge) {
		if (month > 0) {
			long start = System.currentTimeMillis();
			long[] rabbitNumbersArray = new long[month];
			for (int i = 1; i <= month; i++) {
				rabbitNumbersArray[i - 1] = fibonacci(i, bearAge);
			}
			long end = System.currentTimeMillis();
			System.out.println("1月到" + month + "月的兔子数目为:"
					+ Arrays.toString(rabbitNumbersArray) + ",使用时间为"
					+ (end - start));
		} else {
			System.out.println("输入月份必须大于0");
		}
	}

	private int fibonacci(int n, int bearAge) {
		if (n < bearAge) {
			return 1;
		} else {
			return fibonacci(n - 1, bearAge)
					+ fibonacci(n - (bearAge - 1), bearAge);
		}
	}

	/*
	 * 根据费式数列特点,当前值为前两项之和
	 */
	public void printRabbit3(int month, int bearAge) {
		if (month > 0) {
			long start = System.currentTimeMillis();
			long[] rabbitNumbersArray = new long[month];
			int currentMonth = 0;
			for (currentMonth = 1; currentMonth < bearAge; currentMonth++) {
				rabbitNumbersArray[currentMonth - 1] = 1;
			}
			for (currentMonth = bearAge; currentMonth <= month; currentMonth++) {
				rabbitNumbersArray[currentMonth - 1] = rabbitNumbersArray[currentMonth
						- bearAge]
						+ rabbitNumbersArray[currentMonth - 2];
			}
			long end = System.currentTimeMillis();
			System.out.println("1月到" + month + "月的兔子数目为:"
					+ Arrays.toString(rabbitNumbersArray) + ",使用时间为"
					+ (end - start));
		} else {
			System.out.println("输入月份必须大于0");
		}
	}

	public static void main(String[] args) {
		RabbitService service = new RabbitService();
		int bearAge = 3;
		service.printRabbit(20, bearAge);
		service.printRabbit2(20, bearAge);
		service.printRabbit3(20, bearAge);
	}
}

 

输出:

1月到20月的兔子数目为:[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765],使用时间为6
1月到20月的兔子数目为:[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765],使用时间为2
1月到20月的兔子数目为:[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765],使用时间为0

 

分享到:
评论

相关推荐

    Algorithm.rar_Algorithm Gossip_gossip_gossip algorithm_gossip算法

    2.Algorithm Gossip: 费式数列 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官 6.Algorithm Gossip: 老鼠走迷官(二) 7.Algorithm Gossip: 骑士走棋盘 8.Algorithm Gossip: 八皇 9....

    程序员经典算法大全

    ### 程序员经典算法大全:河内之塔与费式数列解析 #### 河内之塔 河内之塔(Towers of Hanoi),亦被称为汉诺塔,是一个源自19世纪的经典递归算法问题。传说中,这个问题源自于印度教的一个神话,但在1883年被法国...

    C语言经典算法大全.pdf

    费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色 三色河内塔 背包问题(Knapsack Problem) 数 运算 蒙地卡罗法求 PI ...

    经典算法大全,包括河内之塔,费式数列,巴斯卡三角形,三色棋,老鼠走迷宫...

    斐波那契数列广泛应用于各种数学和计算机科学问题,如计算黄金分割比例、模拟自然现象和优化算法设计。最常用的计算斐波那契数列的方法有递归、动态规划和矩阵快速幂等。 3. **帕斯卡三角形(Pascal's Triangle)**...

    C语言经典算法

    本篇主要介绍了三个算法:河内之塔、费式数列和巴斯卡三角形。 1. **河内之塔**:河内之塔是一个经典的递归问题,源于19世纪的数学游戏。游戏包含三根柱子和一堆盘子,目标是将所有盘子从第一根柱子移到第三根柱子...

    Catalan数列的详细介绍(总结版)

    同时,Catalan 数列也可以用于解决一些实际问题,例如堆栈问题、图形问题、排列问题等。 在实际应用中,Catalan 数列的计算可以使用递推关系式或组合数公式,但是这类方法通常都需要大量的计算和存储空间。为了解决...

    c语言经典算法

    费式数列在自然界和计算机科学中都有广泛应用,如模拟生物增长、优化问题和图形学等。C语言实现费式数列通常使用循环或递归来计算数列中的特定项。例如,可以使用动态规划存储先前计算过的值,避免重复计算,提高...

    第三讲-经典算法的Java实现.doc

    【标题】和【描述】中提到的是经典的计算机科学算法,它们分别是河内塔问题和费式数列(Fibonacci数列),并且都是用Java语言实现的。在【标签】中,提到了“算法”、“java”、“文档资料”和“开发语言”,这表明...

    Java算法经典案列

    【Java算法经典案例】涉及了多个经典的算法问题,包括河内之塔、费式数列、巴斯卡三角形以及三色棋。这些算法都是计算机科学中的基础和重要组成部分,不仅在理论研究中占有重要地位,也在实际编程和解决问题中有着...

    经典算法C语言经典算法C语言.pdf

    本资源是一份关于经典算法的C语言实现文档,涵盖了多种经典算法和数据结构,包括汉若塔、费式数列、巴斯卡三角形、棋盘游戏、八皇后、生命游戏、字串核对、双色河内塔、背包问题等。下面将逐一对这些算法和数据结构...

    c语言经典算法案例

    2. 费式数列(Fibonacci Sequence):费式数列是一个在自然界中广泛出现的数列,其定义是数列中的每个数等于前两个数之和,通常以1和1开始。费式数列与递归有密切关系,可以递归地定义为:f(n) = f(n-1) + f(n-2),...

    C语言经典算法大全.doc

    2. **费式数列(Fibonacci Sequence)**:费式数列中的每个数是前两个数的和,通常表示为Fn=Fn-1+Fn-2,对于初始值F0=0和F1=1。C语言中,可以使用循环或递归来生成费式数列。 ```c int main() { int Fib[N]; // ...

    数据结构算法100例

    本篇文章将深入探讨一些经典的数据结构和算法实例,包括河内之塔、费式数列,以及多种排序和搜索方法。 首先,河内之塔是一个经典的递归问题,展示了如何通过递归算法解决复杂问题。它要求将一堆盘子从一根柱子移动...

    数据结构与算法中的经典算法(C语言)

    ### 数据结构与算法中的经典算法(C语言) ...以上是关于河内塔问题、费式数列和巴斯卡三角形的详细介绍及对应的C语言实现。这些经典算法不仅有助于加深对递归和数组的理解,而且在实际编程中也有广泛的应用。

    C语言的一些常用算法

    C语言实现费式数列可以通过循环或递归完成,这里使用循环实现了一个简单的数组存储费式数列的前N项。 此外,还有**排序算法**,如**选择排序(Selection Sort)、插入排序(Insertion Sort)、冒泡排序(Bubble ...

    C语言语法经典算法大全

    2. **费式数列**:费式数列是数学中的一个重要概念,每个数是前两个数的和。递归和动态规划都是解决费式数列的有效方法。 3. **背包问题**:这是一个典型的动态规划问题,用于求解如何在容量限制下选取物品以最大化...

    比较经典问题的Java算法

    本篇文章将探讨几个经典的Java算法实现,包括费式数列、巴斯卡三角形和三色棋问题。 1. **费式数列 (Fibonacci)** 费式数列是一个典型的递归序列,其定义为:第一项和第二项都是1,从第三项开始,每一项都是前两项...

Global site tag (gtag.js) - Google Analytics