码迷,mamicode.com
首页 > 其他好文 > 详细

step2 for new acmer 学习斐波那契数列

时间:2015-03-18 15:50:34      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

2015-3-19 时限2天

斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
这个数列从第三项开始,每一项都等于前两项之和。
有很多问题都是斐波那契数列的变形
 
斐波那契数列的原型是来自兔子繁殖问题,在此之前我们先来看看跳台阶的问题

跳台阶问题

题目描述

一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级。

求总共有多少总跳法,并分析算法的时间复杂度。

分析与解法

首先考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳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)。

我们把上面的分析用一个公式总结如下:

        /  1                             n = 1
f(n)=      2                             n = 2
        \  f(n-1) + f(n-2)               n > 2

原来上述问题就是我们平常所熟知的Fibonacci数列问题。可编写代码,如下:

long long Fibonacci(unsigned int n)
{
    int result[3] = {0, 1, 2};
    if (n <= 2)
        return result[n];

    return Fibonacci(n - 1) + Fibonacci(n - 2);
}

 

那么,如果一个人上台阶可以一次上1个,2个,或者3个呢?这个时候,公式是这样写的:

        / 1                                      n = 1
f(n)=     2                                      n = 2
          4                                      n = 3       //111, 12, 21, 3
        \ f(n-1)+f(n-2)+f(n-3)                   n > 3

兔子繁殖问题

如果有一对小兔,每一个月都生下一对小兔,而所生下的每一对小兔在出生后的第三个月也都生下一对小兔。那么,由一对新兔子开始,满一年时一共可以繁殖成多少对兔子?

技术分享
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个月时的兔子都可以生育了。
思考后再看

思考2:如果有一对小兔,每一个月都生下一对小兔,而所生下的每一对小兔在出生后的第k个月也都生下一对小兔。那么,由一对兔子开始,满一年时一共可以繁殖成多少对兔子?

这种情况下的推导公式怎么写?

技术分享
f(n)=f(n-1)+f(n-k+1)
第n个月的数量正好是第n-1个月第n-k+1个月的数量
第n-k+1个月的数量可以视为 第n-k+1个月中已经具备繁殖能力的兔子和尚未具备繁殖能力的兔子总和, 他们都会在第n个月繁殖
思考后再看

练习:

http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1214

http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1347

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2290

 

step2 for new acmer 学习斐波那契数列

标签:

原文地址:http://www.cnblogs.com/kylehz/p/4347220.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!