古典问题:有一对兔子,从出生后第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
相关推荐
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年被法国...
费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色 三色河内塔 背包问题(Knapsack Problem) 数 运算 蒙地卡罗法求 PI ...
斐波那契数列广泛应用于各种数学和计算机科学问题,如计算黄金分割比例、模拟自然现象和优化算法设计。最常用的计算斐波那契数列的方法有递归、动态规划和矩阵快速幂等。 3. **帕斯卡三角形(Pascal's Triangle)**...
本篇主要介绍了三个算法:河内之塔、费式数列和巴斯卡三角形。 1. **河内之塔**:河内之塔是一个经典的递归问题,源于19世纪的数学游戏。游戏包含三根柱子和一堆盘子,目标是将所有盘子从第一根柱子移到第三根柱子...
同时,Catalan 数列也可以用于解决一些实际问题,例如堆栈问题、图形问题、排列问题等。 在实际应用中,Catalan 数列的计算可以使用递推关系式或组合数公式,但是这类方法通常都需要大量的计算和存储空间。为了解决...
费式数列在自然界和计算机科学中都有广泛应用,如模拟生物增长、优化问题和图形学等。C语言实现费式数列通常使用循环或递归来计算数列中的特定项。例如,可以使用动态规划存储先前计算过的值,避免重复计算,提高...
【标题】和【描述】中提到的是经典的计算机科学算法,它们分别是河内塔问题和费式数列(Fibonacci数列),并且都是用Java语言实现的。在【标签】中,提到了“算法”、“java”、“文档资料”和“开发语言”,这表明...
【Java算法经典案例】涉及了多个经典的算法问题,包括河内之塔、费式数列、巴斯卡三角形以及三色棋。这些算法都是计算机科学中的基础和重要组成部分,不仅在理论研究中占有重要地位,也在实际编程和解决问题中有着...
本资源是一份关于经典算法的C语言实现文档,涵盖了多种经典算法和数据结构,包括汉若塔、费式数列、巴斯卡三角形、棋盘游戏、八皇后、生命游戏、字串核对、双色河内塔、背包问题等。下面将逐一对这些算法和数据结构...
2. 费式数列(Fibonacci Sequence):费式数列是一个在自然界中广泛出现的数列,其定义是数列中的每个数等于前两个数之和,通常以1和1开始。费式数列与递归有密切关系,可以递归地定义为:f(n) = f(n-1) + f(n-2),...
2. **费式数列(Fibonacci Sequence)**:费式数列中的每个数是前两个数的和,通常表示为Fn=Fn-1+Fn-2,对于初始值F0=0和F1=1。C语言中,可以使用循环或递归来生成费式数列。 ```c int main() { int Fib[N]; // ...
本篇文章将深入探讨一些经典的数据结构和算法实例,包括河内之塔、费式数列,以及多种排序和搜索方法。 首先,河内之塔是一个经典的递归问题,展示了如何通过递归算法解决复杂问题。它要求将一堆盘子从一根柱子移动...
### 数据结构与算法中的经典算法(C语言) ...以上是关于河内塔问题、费式数列和巴斯卡三角形的详细介绍及对应的C语言实现。这些经典算法不仅有助于加深对递归和数组的理解,而且在实际编程中也有广泛的应用。
C语言实现费式数列可以通过循环或递归完成,这里使用循环实现了一个简单的数组存储费式数列的前N项。 此外,还有**排序算法**,如**选择排序(Selection Sort)、插入排序(Insertion Sort)、冒泡排序(Bubble ...
2. **费式数列**:费式数列是数学中的一个重要概念,每个数是前两个数的和。递归和动态规划都是解决费式数列的有效方法。 3. **背包问题**:这是一个典型的动态规划问题,用于求解如何在容量限制下选取物品以最大化...
本篇文章将探讨几个经典的Java算法实现,包括费式数列、巴斯卡三角形和三色棋问题。 1. **费式数列 (Fibonacci)** 费式数列是一个典型的递归序列,其定义为:第一项和第二项都是1,从第三项开始,每一项都是前两项...