兔子繁殖问题 斐波那契数列又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。 一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子? 我们不妨拿新出生的一对小兔子分析一下: 第一个月小兔子没有繁殖能力,所以还是一对; 两个月后,生下一对小兔对数共有两对; 三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;
兔子数量从开始到目标时间形成的序列,其实是个斐波那契数列。
经过月数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | ... |
幼仔对数 | 1 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | |
成兔对数 | 0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | |
总体对数 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 |
一般需要将这个问题简化,需要考虑2个问题:
1.递归序列的递归条件,即什么条件下进行递归调用;
2.递归序列的返回条件,递归中一定要有返回,否则就是永远也执行不完的程序,直到虚拟机报StackOverflowException;
使用递归实现代码:
/** * 斐波那契数列 * Created by llj on 2019/7/6. */ public class Fibonacci { /** * 假设一个数列满足如下规则: * 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, * 89, 144, 233,377,610,987,1597,2584,4181,6765 * <p> * 请推导出其公式,并求证:第23个数是多少? * <p> * * 公式推导: * f(1) = 1; f(2) = 1; f(3) = 2; f(4) = f(3)+ f(2) = f(4-1)+f(4-2) * 最后推导出公式: f(n) = f(n-1) + f(n-2) {n>=1} */ public static long fun(long n) { if (n == 1 || n == 2) { return 1; } return (fun(n - 1) + fun(n - 2)); } public static void main(String[] args) { long fun = fun(23); System.out.println(fun); } }
完结 -------------------
原文地址:https://www.cnblogs.com/shiguangmanbu2016/p/11143620.html
时间: 2024-10-13 14:11:24