某日到某公司笔试~遇到以下算法题目,顿时蒙了,冥思苦想不得其解,只怪当时数据结构与算法这门课没好好学,现在真是狼狈。
归来,上百度一搜,原来是一道Fibonacci 问题,真无奈,为什么学过Fibonacci却不知道兔子繁殖问题呢?真是可笑~~学习不彻底惹的祸,不过吃一堑长一智,现将问题及答案记录下来:
1,1,2,3,5,8,13,21。。。
称为裴波那契数列
有许多神奇也叫兔子数列
神奇一、一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔都不死,那么一年以后可以繁殖多少对兔子?
我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对;
两个月后,生下一对小兔民数共有两对;
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;
------
依次类推珂以列出下表:
所经过月数:0123456789101112
兔子对数:1 1 2 3 5 8 13 21 34 55 89 144 233
表中数字1,1,2,3,5,8---构成了一个序列。这个数列有关十分明显的特点,那是:前面相邻两项之和,构成了后一项。
我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对;
两个月后,生下一对小兔民数共有两对;
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;
------
依次类推珂以列出下表:
所经过月数:0123456789101112
兔子对数:1 1 2 3 5 8 13 21 34 55 89 144 233
表中数字1,1,2,3,5,8---构成了一个序列。这个数列有关十分明显的特点,那是:前面相邻两项之和,构成了后一项。
神奇二、有一楼梯共10级,一人每一步要跨一级也可跨二级,某人从第一级走到第十级共有几种不同的走法?
想一下这也可以用裴波那契数
想一下这也可以用裴波那契数
程序大概是这样写的:
class Rabit
{
public static int caclulate(int m) //通过递归来计算
{
if (m <= 2)
{
return 1;
} else
return caclulate(m-1) + caclulate(m-2);
}
public static void main(String[] args)
{
for(int i=1; i<=12; ++i)
System.out.println("第" + i + "月:" + Rabit.caclulate(i));
}
}