AHU-OJ-8 童年趣事与斐波那契家的兔子

来源:互联网 发布:淘宝搜图 编辑:程序博客网 时间:2024/04/28 10:31

Description

redraiment小时候走路喜欢蹦蹦跳跳,他最喜欢在楼梯上跳来跳去。
但年幼的他一次只能走上一阶或者一下子蹦上两阶。
现在一共有N阶台阶,请你计算一下Redraiment从第0阶到第N阶共有几种走法。

Input

输入包括多组数据。
每组数据包括一行:N(1≤N≤40)。
输入以0结束。

Output

对应每个输入包括一个输出。
为redraiment到达第n阶不同走法的数量。

点击打开链接

——————————————————————————————分割线——————————————————————————————

一开始拿到这道题感觉没有思路,想着怎么用递归来解决。后来列出来前几阶的方法数,看出来是斐波那契数列(Fibonacci sequence):1、1、2、3、5、8、13、21、34......

在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)

所以本题出一个数组和一个for循环就可以解决(没必要调用函数递归):




因为本题给了台阶上限40,所以出一个[41]的数组,这样数组里的最后一个元素就是[40]了。

因为   f[i] = f[i-1] + f[i-2];所以i要从2开始。

可以把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);另一种选择是第一次跳2级,此时跳法数目等于后面剩下n-2级台阶的跳法数目,即为f(n-2)。因此,n级台阶的不同跳法的总数f(n)=f(n-1)+f(n-2)。分析到这里,不难看出这实际上就是斐波那契数列了。



——————————————————————————————分割线——————————————————————————————



斐波那契数列又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。

设有一对新生的兔子,从第三个月开始他们每个月都生一对兔子,新生的兔子从第三个月开始又每个月生一对兔子。
按此规律,并假定兔子没有死亡,n个月后共有多少个兔子?

f(1) = 1(第1个月有一对兔子)
f(2) = 1(第2个月还是一对兔子)
f(3) = 2(原来有一对兔子,第3个开始,每个月生一对兔子)
f(4) = 3(原来有两对兔子,有一对可以生育)
f(5) = 5(原来有3对兔子,第3个月出生的那对兔子也可以生育了,那么现在有两对兔子可以生育)
f(6) = 8(原来有5对兔子,第4个月出生的那对兔子也可以生育了,那么现在有3对兔子可以生育)
..............
由以上可以看出,第n个月兔子的对数为
f(n) = f(n - 1) + f(n - 2);
f(n-1)是上个月的兔子数量,是原来有的。
f(n-2)是可以生育的兔子数,即多出来的数量。第n-2个月开始后的第3个月是第n个月,此时第n-2个月时的兔子都可以生育了。


下面使用了迭代、递归和数组三种解法。


运行结果:
运行结果:输入要计算的月数:10第1个月有1只第2个月有1只第3个月有2只第4个月有3只第5个月有5只第6个月有8只第7个月有13只第8个月有21只第9个月有34只第10个月有55只



运行结果:
输入要计算的月数:1010个月的兔子总数为55
递归看上去非常符合逻辑,但是这种递归效率是非常慢的。具体请看点击打开链接


运行结果:
请输入月数:10第10个月的兔子为:55












3 0
原创粉丝点击